Advertisement
pdpd123

Problem 1

Feb 17th, 2020
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define ar array
  6.  
  7. const int mxN=2e5;
  8. int n, a[mxN], q, qt, qi, qj, d[mxN], anc[mxN][18];
  9. ar<int, 2> st[1<<19];
  10.  
  11. //is a anc of b
  12. bool ia(int a, int b) {
  13.     int dd=d[b]-d[a];
  14.     for(int i=17; i>=0; --i) {
  15.         if(dd>=1<<i) {
  16.             b=anc[b][i];
  17.             dd-=1<<i;
  18.         }
  19.     }
  20.     return a==b;
  21. }
  22.  
  23. int lca(int a, int b) {
  24.     if(d[a]>d[b])
  25.         swap(a, b);
  26.     int dd=d[b]-d[a];
  27.     for(int i=17; i>=0; --i) {
  28.         if(dd>=1<<i) {
  29.             b=anc[b][i];
  30.             dd-=1<<i;
  31.         }
  32.     }
  33.     if(a==b)
  34.         return a;
  35.     for(int i=17; i>=0; --i) {
  36.         if(anc[a][i]!=anc[b][i]) {
  37.             a=anc[a][i];
  38.             b=anc[b][i];
  39.         }
  40.     }
  41.     return anc[a][0];
  42. }
  43.  
  44. void cmb(ar<int, 2> &a, int b) {
  45.     if(b==-1||a[0]==-1) {
  46.         a[0]=a[1]=-1;
  47.         return;
  48.     }
  49.     if(d[a[0]]<d[a[1]])
  50.         swap(a[0], a[1]);
  51.     //d[a[0]] > d[a[1]]
  52.     if(ia(a[1], a[0])) {
  53.         if(d[a[1]]<=d[b]&&d[b]<=d[a[0]]&&ia(b, a[0]))
  54.             return;
  55.         if(ia(a[0], b)) {
  56.             a[0]=b;
  57.             return;
  58.         }
  59.         int c=lca(a[0], b);
  60.         if(d[c]>d[a[1]]) {
  61.             a[0]=a[1]=-1;
  62.             return;
  63.         }
  64.         a[1]=b;
  65.         return;
  66.     } else {
  67.         if(ia(a[0], b)) {
  68.             a[0]=b;
  69.             return;
  70.         }
  71.         if(ia(a[1], b)) {
  72.             a[1]=b;
  73.             return;
  74.         }
  75.         int c=lca(a[0], a[1]);
  76.         if(d[b]>=d[c]&&(ia(b, a[0])||ia(b, a[1])))
  77.             return;
  78.         a[0]=a[1]=-1;
  79.         return;
  80.     }
  81. }
  82.  
  83. ar<int, 2> cmb2(ar<int, 2> a, ar<int, 2> b) {
  84.     cmb(a, b[0]);
  85.     cmb(a, b[1]);
  86.     return a;
  87. }
  88.  
  89. void upd(int l1, ar<int, 2> x, int i=1, int l2=0, int r2=n-1) {
  90.     if(l2==r2) {
  91.         st[i]=x;
  92.         return;
  93.     }
  94.     int m2=(l2+r2)/2;
  95.     if(l1<=m2)
  96.         upd(l1, x, 2*i, l2, m2);
  97.     else
  98.         upd(l1, x, 2*i+1, m2+1, r2);
  99.     st[i]=cmb2(st[2*i], st[2*i+1]);
  100. //  cout << i << " " << st[i][0] << " " << st[i][1] << endl;
  101. }
  102.  
  103. int qry(int i=1, int l2=0, int r2=n-1, ar<int, 2> p={}) {
  104.     ar<int, 2> a=st[i];
  105.     if(l2)
  106.         a=cmb2(a, p);
  107.     if(a[0]!=-1)
  108.         return r2+1;
  109.     if(l2==r2)
  110.         return l2;
  111.     int m2=(l2+r2)/2;
  112.     ar<int, 2> b=st[2*i];
  113.     if(l2)
  114.         b=cmb2(b, p);
  115.     if(b[0]!=-1)
  116.         return qry(2*i+1, m2+1, r2, b);
  117.     return qry(2*i, l2, m2, p);
  118. }
  119.  
  120. int main() {
  121.     ios_base::sync_with_stdio(0);
  122.     cin.tie(0);
  123.    
  124.     cin >> n;
  125.     for(int i=0; i<n; ++i)
  126.         cin >> a[i];
  127.     memset(anc[0], -1, sizeof(anc[0]));
  128.     for(int i=1; i<n; ++i) {
  129.         cin >> anc[i][0], --anc[i][0];
  130.         d[i]=d[anc[i][0]]+1;
  131.         for(int j=1; j<18; ++j)
  132.             anc[i][j]=anc[i][j-1]==-1?-1:anc[anc[i][j-1]][j-1];
  133.     }
  134.     for(int i=0; i<n; ++i)
  135.         upd(a[i], {i, i});
  136.     ar<int, 2> b=cmb2({0, 0}, {2, 2});
  137. //  cout << b[0] << " " << b[1] << endl;
  138.     cin >> q;
  139.     while(q--) {
  140.         cin >> qt;
  141.         if(qt==1) {
  142.             cin >> qi >> qj, --qi, --qj;
  143.             swap(a[qi], a[qj]);
  144.             upd(a[qi], {qi, qi});
  145.             upd(a[qj], {qj, qj});
  146.         } else
  147.             cout << qry() << "\n";
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement