50342023-04-10 11:57:16rmlanHegyi levegőcpp14Time limit exceeded 50/1003.095s337464 KiB
#include<bits/stdc++.h>
using namespace std;

int n,m,q,timer=0;
int m2;
vector<vector<pair<int, int> > > g;
vector<pair<int, int> > e;
vector<int> p,sz,tin,tout,dis;
vector<bool> vis;
int anc[500001][21]={0};
int mx[500001][21]={0};

void make_set(int v){
    p[v]=v;
    sz[v]=1;
}

int find_set(int v){
    if(p[v] == v) return v;
    return p[v]=find_set(p[v]);
}

bool unite(int a, int b){
    a = find_set(a);
    b = find_set(b);
    if(a == b) return 0;
    if(sz[a] < sz[b]) swap(a,b);
    p[b]=a;
    sz[a]+=sz[b];
    return 1;
}

int na(int u, int nn, int b=20){
    if(!nn) return u;
    for(int i = b; i >= 0; i--){
        if(nn-(1 << i) >= 0) return na(anc[u][i], nn-(1<<i), i);
    }
}
int nm(int u, int nn, int b=20){
    if(!nn) return 0;
    if(nn==1) return mx[u][0];
    for(int i = b; i >= 0; i--){
        if(nn-(1 << i) >= 0) return max(mx[u][i], nm(anc[u][i], nn-(1<<i), i));
    }
}


void dfs(int u, int it){

    if(vis[u]) return;
    tin[u]=timer++;
    vis[u]=1;
    if(it > 0){
        anc[u][it] = anc[anc[u][it-1]][it-1];
        mx[u][it]= max(mx[u][it-1], mx[anc[u][it-1]][it-1]);
    }
    for(pair<int, int> pr:g[u]){
        if(vis[pr.second]) continue;

        if(!it){
            dis[pr.second]=dis[u]+1;
            anc[pr.second][0]=u;
            mx[pr.second][0]=pr.first;
        }
        dfs(pr.second, it);
    }
    tout[u] = timer++;
}

int solve(int a, int b){
    if(dis[a] > dis[b]) swap(a,b);

    if(tin[a] < tin[b] && tout[a] > tout[b]){
        return nm(b, dis[b]-dis[a]);
    }
    int cr=0;
    for(int i = 19; i >= 0; i--){
        if(na(b, cr+(1 << i)+dis[b]-dis[a]) != na(a, cr+(1<<i))){

            cr +=(1<<i);
        }
    }
    cr++;

    return max(nm(b,cr+dis[b]-dis[a]), nm(a,cr));
}

int main(){

    cin >> n >> m >> q;
    int mp[n][m];

    g.resize(n*m);
    p.resize(n*m);
    sz.resize(n*m);
    tin.resize(n*m);
    tout.resize(n*m);
    dis.resize(n*m);
    vector<pair<int, int> > ek;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            //cin >> mp[i][j];
            scanf("%d", &mp[i][j]);
            if(i>0){
                e.push_back({max(mp[i][j], mp[i-1][j]), (i*m+j)*10});
            }
            if(j > 0){
                e.push_back({max(mp[i][j], mp[i][j-1]), (i*m+j)*10+1});
            }
        }
    }
    sort(e.begin(), e.end());
    for(int i = 0; i < n*m; i++){
        make_set(i);
    }
    for(pair<int, int> pa:e){
        if(pa.second%10){

            if(unite(pa.second/10, pa.second/10-1)){
                g[pa.second/10].push_back({pa.first, pa.second/10-1});
            g[pa.second/10-1].push_back({pa.first, pa.second/10});
            }
        }else{

            if(unite(pa.second/10, pa.second/10-m)){g[pa.second/10].push_back({pa.first, pa.second/10-m});
            g[pa.second/10-m].push_back({pa.first, pa.second/10});

            }
        }
    }
    anc[n*m/2][0]=n*m/2;
    dis[n*m/2]=0;
    for(int i = 0; i < 20; i++){
        vis.assign(n*m, 0);
        dfs(n*m/2, i);
    }


    while(q--){
        int ai,bi,ci,di;
        //cin >> ai >> bi >> ci >> di;
        scanf("%d %d %d %d",&ai, &bi, &ci, &di);
        cout << solve(ai*m+bi-m-1, ci*m+di-m-1) << endl;

    }

}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted3ms1884 KiB
2Accepted3ms2232 KiB
subtask219/19
3Accepted13ms5380 KiB
4Accepted14ms5416 KiB
5Accepted14ms5328 KiB
6Accepted14ms5484 KiB
7Accepted14ms5740 KiB
8Accepted14ms5712 KiB
9Accepted14ms5964 KiB
10Accepted13ms6500 KiB
subtask30/20
11Accepted3ms3832 KiB
12Accepted7ms4464 KiB
13Accepted57ms9740 KiB
14Accepted653ms61572 KiB
15Time limit exceeded3.075s148076 KiB
subtask40/20
16Accepted2.279s293224 KiB
17Accepted2.746s293484 KiB
18Time limit exceeded3.092s141628 KiB
19Time limit exceeded3.052s136300 KiB
20Time limit exceeded3.072s135512 KiB
subtask531/31
21Accepted1.207s62080 KiB
22Accepted1.35s59724 KiB
23Accepted1.396s57580 KiB
24Accepted1.363s57464 KiB
25Accepted1.157s62420 KiB
26Accepted1.345s57076 KiB
27Accepted1.052s57720 KiB
28Accepted1.406s62508 KiB
29Accepted620ms71064 KiB
subtask60/10
30Time limit exceeded3.085s148852 KiB
31Time limit exceeded3.062s142448 KiB
32Time limit exceeded3.062s136936 KiB
33Time limit exceeded3.072s136100 KiB
34Time limit exceeded3.068s149128 KiB
35Time limit exceeded3.095s157908 KiB
36Time limit exceeded3.091s133524 KiB
37Time limit exceeded3.072s134452 KiB
38Time limit exceeded3.065s149188 KiB
39Accepted1.934s337464 KiB