5030 2023. 04. 10 00:50:09 rmlan Hegyi levegő cpp14 Időlimit túllépés 50/100 3.098s 345492 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 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];
            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)) ek.push_back(pa);
        }else{

            if(unite(pa.second/10, pa.second/10-m)) ek.push_back(pa);
        }
    }
    for(pair<int, int> pa:ek){
        if(pa.second%10){
            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{
            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;

        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 1824 KiB
2 Elfogadva 3ms 2168 KiB
subtask2 19/19
3 Elfogadva 14ms 5348 KiB
4 Elfogadva 16ms 5436 KiB
5 Elfogadva 16ms 5404 KiB
6 Elfogadva 16ms 5480 KiB
7 Elfogadva 17ms 5664 KiB
8 Elfogadva 17ms 5948 KiB
9 Elfogadva 16ms 6216 KiB
10 Elfogadva 14ms 6408 KiB
subtask3 0/20
11 Elfogadva 3ms 3504 KiB
12 Elfogadva 8ms 4152 KiB
13 Elfogadva 61ms 9400 KiB
14 Elfogadva 822ms 62976 KiB
15 Időlimit túllépés 3.072s 151824 KiB
subtask4 0/20
16 Elfogadva 2.971s 300972 KiB
17 Elfogadva 2.936s 301232 KiB
18 Időlimit túllépés 3.049s 145244 KiB
19 Időlimit túllépés 3.081s 139648 KiB
20 Időlimit túllépés 3.052s 138920 KiB
subtask5 31/31
21 Elfogadva 1.292s 63344 KiB
22 Elfogadva 1.407s 60960 KiB
23 Elfogadva 1.375s 58856 KiB
24 Elfogadva 1.416s 58936 KiB
25 Elfogadva 1.273s 63728 KiB
26 Elfogadva 1.36s 58516 KiB
27 Elfogadva 1.398s 59168 KiB
28 Elfogadva 1.473s 64120 KiB
29 Elfogadva 805ms 72628 KiB
subtask6 0/10
30 Időlimit túllépés 3.079s 152764 KiB
31 Időlimit túllépés 3.085s 146128 KiB
32 Időlimit túllépés 3.066s 140628 KiB
33 Időlimit túllépés 3.085s 139920 KiB
34 Időlimit túllépés 3.088s 153000 KiB
35 Időlimit túllépés 3.084s 161988 KiB
36 Időlimit túllépés 3.098s 137476 KiB
37 Időlimit túllépés 3.078s 138448 KiB
38 Időlimit túllépés 3.065s 153400 KiB
39 Elfogadva 2.753s 345492 KiB