5034 2023. 04. 10 11:57:16 rmlan Hegyi levegő cpp14 Időlimit túllépés 50/100 3.095s 337464 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;

    }

}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1884 KiB
2 Elfogadva 3ms 2232 KiB
subtask2 19/19
3 Elfogadva 13ms 5380 KiB
4 Elfogadva 14ms 5416 KiB
5 Elfogadva 14ms 5328 KiB
6 Elfogadva 14ms 5484 KiB
7 Elfogadva 14ms 5740 KiB
8 Elfogadva 14ms 5712 KiB
9 Elfogadva 14ms 5964 KiB
10 Elfogadva 13ms 6500 KiB
subtask3 0/20
11 Elfogadva 3ms 3832 KiB
12 Elfogadva 7ms 4464 KiB
13 Elfogadva 57ms 9740 KiB
14 Elfogadva 653ms 61572 KiB
15 Időlimit túllépés 3.075s 148076 KiB
subtask4 0/20
16 Elfogadva 2.279s 293224 KiB
17 Elfogadva 2.746s 293484 KiB
18 Időlimit túllépés 3.092s 141628 KiB
19 Időlimit túllépés 3.052s 136300 KiB
20 Időlimit túllépés 3.072s 135512 KiB
subtask5 31/31
21 Elfogadva 1.207s 62080 KiB
22 Elfogadva 1.35s 59724 KiB
23 Elfogadva 1.396s 57580 KiB
24 Elfogadva 1.363s 57464 KiB
25 Elfogadva 1.157s 62420 KiB
26 Elfogadva 1.345s 57076 KiB
27 Elfogadva 1.052s 57720 KiB
28 Elfogadva 1.406s 62508 KiB
29 Elfogadva 620ms 71064 KiB
subtask6 0/10
30 Időlimit túllépés 3.085s 148852 KiB
31 Időlimit túllépés 3.062s 142448 KiB
32 Időlimit túllépés 3.062s 136936 KiB
33 Időlimit túllépés 3.072s 136100 KiB
34 Időlimit túllépés 3.068s 149128 KiB
35 Időlimit túllépés 3.095s 157908 KiB
36 Időlimit túllépés 3.091s 133524 KiB
37 Időlimit túllépés 3.072s 134452 KiB
38 Időlimit túllépés 3.065s 149188 KiB
39 Elfogadva 1.934s 337464 KiB