Submission #1344548

#TimeUsernameProblemLanguageResultExecution timeMemory
1344548wangzhiyi33Bitaro's Travel 2 (JOI25_travel2)C++20
100 / 100
559 ms104516 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back
#pragma GCC optimize("O3,unroll-loops")

const int maxn=3e5;
vector<int>adj[maxn+2];
int dsu[maxn+2],n,m,l,bin[maxn+2][20];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};

int con(int a,int b){
    return (a-1)*m+b;
}

bool ins(int a,int b){
    return (a>0 && b>0 && a<=n && b<=m);
}

vector<array<int,4> >isi;

int fin(int a){
    if(dsu[a]==a)return a;
    return dsu[a]=fin(dsu[a]);
}

void merg(int a,int b){
    a=fin(a),b=fin(b);
    if(a==b)return;
    dsu[a]=b;
}

int in[maxn+2],out[maxn+2];
int cnt;

void dfs(int cur){
    //cout<<cur<<" ";
    in[cur]=++cnt;
    for(auto x : adj[cur])dfs(x);
    out[cur]=cnt;
}

ii blk(int apa){
    int hmm=apa%m;
    if(hmm==0)hmm=m;

    apa-=hmm;
    return {apa/m+1,hmm};
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m>>l;
    int grid[n+1][m+1];
    bool vis[n+1][m+1];

    for(int q=1;q<=n;q++){
        for(int w=1;w<=m;w++){
            cin>>grid[q][w];
            vis[q][w]=false;
            dsu[con(q,w)]=con(q,w);
            isi.push_back({grid[q][w],0,q,w});
            isi.push_back({grid[q][w]+l,1,q,w});
        }
    }
    sort(isi.begin(),isi.end());

    for(auto [h,ty,x,y] : isi){
        if(ty==0){
            for(int e=0;e<4;e++){
                int nx=x+dx[e],ny=y+dy[e];
                if(!ins(nx,ny) || !vis[nx][ny])continue;

                int apa=fin(con(nx,ny));
                ii tmp=blk(apa);
               // if(h==13)cout<<apa<<" "<<tmp.first<<' '<<tmp.second<<endl;

                if(apa!=fin(con(x,y))){
                    adj[con(x,y)].push_back(apa);
                    merg(con(nx,ny),con(x,y));
                }
            }
            vis[x][y]=true;
        }
        else{
            bin[con(x,y)][0]=fin(con(x,y));
          //  cout<<con(x,y)<<" k "<<bin[con(x,y)][0]<<endl;
        }
    }

    for(int q=isi.size()-1;q>=0;q--){
        int apa=con(isi[q][2],isi[q][3]);
        
        if(in[apa])continue;
        dfs(apa);
    }

    

    for(int q=1;q<20;q++){
        for(int w=1;w<=n*m;w++){
            bin[w][q]=bin[bin[w][q-1]][q-1];
        }
    }

   // cout<<endl;
    int qu; cin>>qu;
    while(qu--){
        int a,b,c,d; cin>>a>>b>>c>>d;
        int u=con(a,b),v=con(c,d),ans=0;

        int apa=bin[u][0];
        if(in[apa]<=in[v] && in[v]<=out[apa]){
            cout<<1<<endl; continue;
        }
        apa=bin[u][19];
        if(!(in[apa]<=in[v] && in[v]<=out[apa])){
            cout<<-1<<endl; continue;
        }

        for(int q=19;q>=0;q--){
            int apa=bin[u][q];
            if(in[apa]<=in[v] && in[v]<=out[apa]){

            }
            else{
                ans+=(1<<q);
                u=bin[u][q];
            }
        }
        cout<<ans+1<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...