4108 2023. 03. 14 17:14:31 mraron Hegyi levegő cpp17 Elfogadva 100/100 1.667s 380080 KiB
#include<bits/stdc++.h>
using namespace std;
#define xx first
#define yy second

const int MAXQ=500000;

int n,m,k,q;
vector<vector<int>> h;
pair<pair<int,int>, pair<int,int>> qs[MAXQ];

pair<int,int> d0[4]={{-1,0},{1,0},{0,-1},{0,1}};

struct dsu {
    vector<int> par, sz;

    dsu(int n) : par(n, -1), sz(n, 1) {}

    int get(int x) {
        return (par[x]==-1?x:par[x]=get(par[x]));
    }

    void merge(int x, int y) {
        int px=get(x), py=get(y);
        if(px==py) return ;
        
        if(sz[px]>sz[py]) {
            swap(px,py);
            swap(x,y);
        }

        sz[py]+=sz[px];
        par[px]=py;
    }
};

pair<int,int> conv(int x) {
    return {x/m, x%m};
}

int conv(pair<int,int> x) {
    return x.xx*m+x.yy;
}

const int MAXNM=500001;
vector<pair<int,int>> adj[MAXNM];
int par[MAXNM][19];
int dp[MAXNM][19];
int lvl[MAXNM];

void dfs(int x, int y=-1) {
    par[x][0]=y;
    for(auto i:adj[x]) {
        if(y!=i.xx) {
            lvl[i.xx]=lvl[x]+1;
            dfs(i.xx, x);
            dp[i.xx][0]=i.yy;
        }
    }
}

void init(int nm) {
    for(int j=1;j<19;++j) {
        for(int i=0;i<nm;++i) {
            par[i][j]=(par[i][j-1]==-1?-1:par[par[i][j-1]][j-1]);
            dp[i][j]=dp[i][j-1];
            if(par[i][j-1]!=-1) dp[i][j]=max(dp[i][j], dp[par[i][j-1]][j-1]);
        }
    }
}

int answer(int x, int y) {
    if(lvl[x]>lvl[y]) swap(x,y);
    int ans=0;
    for(int i=18;i>=0;i--) {
        if(par[y][i]!=-1 && lvl[par[y][i]]>=lvl[x]) {
            ans=max(ans, dp[y][i]);
            y=par[y][i];
        }
    }
    if(x==y) return ans;
    for(int i=18;i>=0;i--) {
        if(par[y][i]!=par[x][i]) {
            ans=max(ans, max(dp[y][i], dp[x][i]));
            x=par[x][i];
            y=par[y][i];
        }
    }
    
    ans=max(ans, dp[x][0]);
    ans=max(ans, dp[y][0]);
    
    return ans;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m>>q;
    h.assign(n, vector<int>(m));
    for(int i=0;i<n;++i) {
        for(int j=0;j<m;++j) {
            cin>>h[i][j];
        }
    }

    for(int i=0;i<q;++i) {
        cin>>qs[i].xx.xx>>qs[i].xx.yy>>qs[i].yy.xx>>qs[i].yy.yy;
        qs[i].xx.xx--;
        qs[i].xx.yy--;
        qs[i].yy.xx--;
        qs[i].yy.yy--;
    }

    vector<pair<int, pair<int,int>>> lst;
    for(int i=0;i<n;++i) {
        for(int j=0;j<m;++j) {
            lst.push_back({h[i][j], {i, j}});
        }
    }

    sort(lst.begin(), lst.end());
    
    dsu d(n*m);
    vector<bool> had(n*m);
    for(auto i:lst) {
        for(int j=0;j<4;++j) {
            int nx=i.yy.xx+d0[j].xx, ny=i.yy.yy+d0[j].yy;
            if(nx>=0 && ny>=0 && nx<n && ny<m && had[conv({nx, ny})] && d.get(conv({nx, ny}))!=d.get(conv(i.yy))) {
                adj[conv({nx,ny})].emplace_back(conv(i.yy), i.xx);
                adj[conv(i.yy)].emplace_back(conv({nx,ny}), i.xx);
                d.merge(conv({nx, ny}), conv(i.yy));
            }
        }
        
        had[conv(i.yy)]=true;
    }
    
    dfs(0);
    init(n*m);
    
    for(int i=0;i<q;++i) {
        cout<<answer(conv(qs[i].xx), conv(qs[i].yy))<<"\n";
    }

    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 10ms 25344 KiB
2 Elfogadva 10ms 25552 KiB
subtask2 19/19
3 Elfogadva 14ms 28724 KiB
4 Elfogadva 14ms 28320 KiB
5 Elfogadva 17ms 28360 KiB
6 Elfogadva 17ms 28520 KiB
7 Elfogadva 14ms 28776 KiB
8 Elfogadva 17ms 28956 KiB
9 Elfogadva 16ms 29200 KiB
10 Elfogadva 14ms 30192 KiB
subtask3 20/20
11 Elfogadva 10ms 26824 KiB
12 Elfogadva 14ms 27640 KiB
13 Elfogadva 28ms 33008 KiB
14 Elfogadva 256ms 87176 KiB
15 Elfogadva 1.236s 318636 KiB
subtask4 20/20
16 Elfogadva 907ms 318748 KiB
17 Elfogadva 1.144s 369416 KiB
18 Elfogadva 1.065s 260108 KiB
19 Elfogadva 992ms 247660 KiB
20 Elfogadva 1.003s 246616 KiB
subtask5 31/31
21 Elfogadva 393ms 101076 KiB
22 Elfogadva 333ms 79176 KiB
23 Elfogadva 284ms 76864 KiB
24 Elfogadva 314ms 77080 KiB
25 Elfogadva 363ms 91388 KiB
26 Elfogadva 273ms 76704 KiB
27 Elfogadva 264ms 76632 KiB
28 Elfogadva 300ms 91564 KiB
29 Elfogadva 275ms 85320 KiB
subtask6 10/10
30 Elfogadva 1.5s 380080 KiB
31 Elfogadva 1.462s 270468 KiB
32 Elfogadva 1.585s 257936 KiB
33 Elfogadva 1.498s 256288 KiB
34 Elfogadva 1.49s 329456 KiB
35 Elfogadva 1.536s 308792 KiB
36 Elfogadva 967ms 252320 KiB
37 Elfogadva 963ms 252124 KiB
38 Elfogadva 1.667s 329488 KiB
39 Elfogadva 1.363s 298312 KiB