Advertisement
Guest User

Untitled

a guest
Jan 20th, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.85 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define sc(a) scanf("%d",&a)
  6. #define sc2(a,b) scanf("%d%d",&a,&b)
  7. #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
  8. #define pri(x) printf("%d\n",x)
  9. #define prie(x) printf("%d ",x)
  10. #define prif() printf("\n")
  11. #define sz(x) (int)((x).size())
  12. #define mp make_pair
  13. #define pb push_back
  14. #define f first
  15. #define s second
  16. #define BUFF ios::sync_with_stdio(false)
  17.  
  18. typedef long long int ll;
  19. typedef pair<int, int> ii;
  20. typedef vector<int> vi;
  21. typedef vector<vi> vvi;
  22. typedef vector<ii> vii;
  23. const int INF = 0x3f3f3f3f;
  24. const ll LINF = 0x3f3f3f3f3f3f3f3fll;
  25.  
  26. const int MAX = 3e5+10;
  27.  
  28. vvi g(MAX);
  29. vvi w(MAX);
  30. int x, y;
  31. int n, q;
  32. int B[510][510];
  33. vector<pair<int, ii> > ar;
  34. int v[MAX];
  35.  
  36. void build() {
  37.     for (int i = 0; i < n; i++) v[i] = i;
  38. }
  39.  
  40. int find(int k) {
  41.     return v[k] == k ? k : v[k] = find(v[k]);
  42. }
  43.  
  44. void une(int a, int b) {
  45.     v[find(a)] = find(b);
  46. }
  47.  
  48. int get(int a, int b) {
  49.     return (a-1)*y + (b-1);
  50. }
  51.  
  52. void aresta(int a, int b, int c) {
  53.     ar.pb({c, {a, b}});
  54.     n = max({n, a+1, b+1});
  55. }
  56.  
  57. void monta() {
  58.     sc3(x, y, q);
  59.     for (int i = 0; i < x*y; i++) sc(B[i/y][i%y]);
  60.     for (int i = 1; i <= x; i++) for (int j = 1; j <= y; j++) {
  61.         if (i < x) aresta(get(i, j), get(i+1, j), max(B[i-1][j-1], B[i][j-1]));
  62.         if (j < y) aresta(get(i, j), get(i, j+1), max(B[i-1][j-1], B[i-1][j]));
  63.     }
  64. }
  65.  
  66. void kruskal() {
  67.     sort(ar.begin(), ar.end());
  68.     build();
  69.     for (auto i : ar) {
  70.         int a = i.s.f, b = i.s.s, c = i.f;
  71.         if (find(a) == find(b)) continue;
  72.         une(a, b);
  73.         g[a].pb(b);
  74.         w[a].pb(c);
  75.         g[b].pb(a);
  76.         w[b].pb(c);
  77.     }
  78. }
  79.  
  80. int pai[30][MAX], p;
  81. int sobe[30][MAX];
  82. int in[MAX], out[MAX];
  83.  
  84. void dfs(int k, int pa = -1) {
  85.     in[k] = p++;
  86.     for (int i = 0; i < g[k].size(); i++) if (g[k][i] != pa) {
  87.         pai[0][g[k][i]] = k;
  88.         sobe[0][g[k][i]] = w[k][i];
  89.         dfs(g[k][i], k);
  90.     }
  91.     out[k] = p;
  92. }
  93.  
  94. void build_lca() {
  95.     for (int i = 0; i < n; i++) pai[0][i] = i;
  96.     dfs(0);
  97.     for (int k = 1; k < 30; k++) for (int i = 0; i < n; i++) {
  98.         pai[k][i] = pai[k-1][pai[k-1][i]];
  99.         sobe[k][i] = max(sobe[k-1][i], sobe[k-1][pai[k-1][i]]);
  100.     }
  101. }
  102.  
  103. bool anc(int a, int b) {
  104.     return in[a] <= in[b] and out[a] >= out[b];
  105. }
  106.  
  107. int lca(int a, int b) {
  108.     if (anc(a, b)) return a;
  109.     if (anc(b, a)) return b;
  110.     for (int k = 29; k+1; k--) if (!anc(pai[k][a], b)) a = pai[k][a];
  111.     return pai[0][a];
  112. }
  113.  
  114. int dist(int a, int b) {
  115.     int l = lca(a, b);
  116.     if (a == b and a == l) return -1;
  117.     int ret = -1;
  118.     for (int k = 29; k+1; k--) if (!anc(pai[k][a], b)) {
  119.         ret = max(ret, sobe[k][a]);
  120.         a = pai[k][a];
  121.     }
  122.     if (a != l) {
  123.         ret = max(ret, sobe[0][a]);
  124.         a = pai[0][a];
  125.     }
  126.     return max(ret, dist(b, a));
  127. }
  128.  
  129. int main() {
  130.     monta();
  131.     kruskal();
  132.     build_lca();
  133.     while (q--) {
  134.         int a, b, c, d; sc2(a, b), sc2(c, d);
  135.         if (get(a, b) == get(c, d)) pri(B[a-1][b-1]);
  136.         else pri(dist(get(a, b), get(c, d)));
  137.     }
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement