Submission #1363080

#TimeUsernameProblemLanguageResultExecution timeMemory
1363080hitsuujBitaro's Travel 2 (JOI25_travel2)C++20
100 / 100
1417 ms231088 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define lc 2*pos
#define rc 2*pos+1
#define pii pair<int,int>
#define fi first
#define se second
//CEK ENDL DAN INT LL
#define endl '\n'
#define inf 1e18
#define ti tuple<int,int,int>
#define quick ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int mod=1e9+7;
int sf(int a){return (a%mod+mod)%mod;}
int kal(int a,int b){return (sf(a)*sf(b))%mod;}
int tam(int a,int b){return (sf(a)+sf(b))%mod;}
int kur(int a,int b){return (sf(a)+mod-sf(b))%mod;}
#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
int inv(int a){
    if(a<=1) return 1;
    return mod-(int)(mod/a)*inv(mod%a)%mod;
}
int bag(int a,int b){return kal(sf(a),inv(b));}

const int lim=3e5+10;
int par[lim+10];
int sz[lim+10];

int perlu[lim];
int jadi[lim];
pii bagus[lim+10];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
vector<pii>pasang[lim+10];
int p(int x){
    if(x==par[x]) return x;
    return par[x]=p(par[x]);
}
pii mana(pii a,pii b){
    if(a.fi>=b.fi) return a;
    return b; 
}
int cek(int u,int v){
    u=p(u);
    v=p(v);
    if(u==v) return 1;
    return 0; 
}
int vis[lim]; 
vector<int>punyasiap[lim+10]; 
void gab(int u,int v,int val){
    u=p(u);
    v=p(v);
    if(u==v) return;
    if(sz[u]>sz[v]) swap(v,u);
    sz[v]+=sz[u];
    for(auto x:punyasiap[u]){
        for(auto [y,idx]:pasang[x]){
            if(vis[idx]) continue;
            if(p(y)==v && !vis[idx]){
                perlu[idx]=val;
                vis[idx]=1;
            }
        }
        punyasiap[v].pb(x);
    }
    bagus[v]=mana(bagus[v],bagus[u]);
    par[u]=v;
}
int n,m,l;
const int dua=24;
int naik[dua+10][lim];
int gavalid(int x,int y){
    if(1<=x && x<=n && 1<=y && y<=m) return 0;
    return 1; 
}

signed main(){
    quick
    cin>>n>>m>>l;
    int angka[n+10][m+10];
    memset(angka,0,sizeof(angka)); 
    int a[n+10][m+10];
    memset(a,0,sizeof(a)); 
    vector<ti>pts;
    int nm=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            pts.pb({a[i][j],i,j});
            nm++;
            par[nm]=nm; 
            punyasiap[nm].pb(nm);
            sz[nm]=1;
            jadi[nm]=a[i][j]; 
            bagus[nm]={a[i][j],nm}; 
            angka[i][j]=nm;
        }
    }
    int q;cin>>q;
    vector<tuple<int,int,int,int>>quer(1);
    for(int i=1;i<=q;i++){
        int aa,b,c,d;cin>>aa>>b>>c>>d;
        quer.pb({aa,b,c,d});
        pasang[angka[aa][b]].pb({angka[c][d],i});
        pasang[angka[c][d]].pb({angka[aa][b],i});
    }
    priority_queue<pii,vector<pii>,greater<pii>>pq;
    sort(pts.begin(),pts.end());
    
    int cnt=1; 
    for(auto [val,x,y]:pts){
        while(pq.size() && (pq.top().fi+l)<val){
            auto [ang,idx]=pq.top();
            pq.pop();
            naik[0][idx]=bagus[p(idx)].se;
            
        }
        for(int i=0;i<4;i++){
            int nx=x+dx[i];
            int ny=y+dy[i]; 
            if(gavalid(nx,ny) || a[nx][ny]>a[x][y]) continue;
            gab(angka[nx][ny],angka[x][y],val);
        }
        pq.push({val,angka[x][y]});
    }
    while(pq.size()){
        auto [ang,idx]=pq.top();
        pq.pop();
        naik[0][idx]=bagus[p(idx)].se;
    }
    
    for(int i=1;i<dua;i++){
        for(int j=1;j<=nm;j++){
            naik[i][j]=naik[i-1][naik[i-1][j]];
        }
    }
    for(int i=1;i<=q;i++){
        auto [aa,b,c,d]=quer[i];
        if(!cek(angka[aa][b],angka[c][d])){
            cout<<-1<<endl;
            continue;
        }
        int ll=0,r=nm;
        int jaw=-1;
        while(ll<=r){
            int mid=(ll+r)/2;
            int sek=angka[aa][b];
            int cur=mid;
            for(int i=0;i<dua;i++){
                if((1<<i)&cur){
                    cur-=(1<<i);
                    sek=naik[i][sek];
                }
            }
            if(jadi[sek]+l>=perlu[i]){
                jaw=mid+1; 
                r=mid-1;
            }
            else ll=mid+1;
        }
        cout<<jaw<<endl; 
    }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...