Saturday, August 10, 2019

[Toph] Taju Kage Bunshin No Jutsu

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : Taju Kage Bunshin No Jutsu
Source            : Toph.CO
Category          : Data Structure
Algorithm         : Persistent Segment Tree
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 4e5 + 5;  
  6. static const int Max = 2e7 + 5;  
  7.   
  8. struct Node  
  9. {  
  10.       int st;  
  11.       int lft, rgt;  
  12.       Node(int st = 0, int lft = 0, int rgt = 0) : st(st), lft(lft), rgt(rgt) {}  
  13. } Tree[Max];  
  14.   
  15. int version[maxn];  
  16. int NODES;  
  17. int N = 300000 + 5;  
  18.   
  19. int update(int root, int a, int b, int pos, int val)  
  20. {  
  21.       int newNode = ++NODES;  
  22.       Tree[newNode] = Tree[root];  
  23.       if (a == b)  
  24.       {  
  25.             Tree[newNode].st += val;  
  26.             return newNode;  
  27.       }  
  28.       int mid = (a + b) >> 1;  
  29.       if (pos <= mid) Tree[newNode].lft = update(Tree[newNode].lft, a, mid, pos, val);  
  30.       else Tree[newNode].rgt = update(Tree[newNode].rgt, mid + 1, b, pos, val);  
  31.       Tree[newNode].st = Tree[ Tree[newNode].lft ].st + Tree[ Tree[newNode].rgt ].st;  
  32.       return newNode;  
  33. }  
  34.   
  35. int query(int proot, int root, int a, int b, int k)  
  36. {  
  37.       if (a == b) return a;  
  38.       int mid = a + b >> 1;  
  39.       int sizeLeftChild = Tree[ Tree[root].lft ].st - Tree[ Tree[proot].lft ].st;  
  40.       if (k <= sizeLeftChild) return query(Tree[proot].lft, Tree[root].lft, a, mid, k);  
  41.       else return query(Tree[proot].rgt, Tree[root].rgt, mid + 1, b, k - sizeLeftChild);  
  42. }  
  43.   
  44. void init()  
  45. {  
  46.       NODES = 0;  
  47.       version[0] = 0;  
  48.       for (int i = 0; i < maxn; i++) Tree[i] = Node();  
  49. }  
  50.   
  51. struct Query  
  52. {  
  53.       int type;  
  54.       int v;  
  55.       int l, r, k;  
  56.       Query(int type = 0, int v = 0, int l = 0, int r = 0, int k = 0)  
  57.             : type(type)  
  58.             , v(v)  
  59.             , l(l)  
  60.             , r(r)  
  61.             , k(k) {}  
  62. };  
  63.   
  64. vector <Query> queries;  
  65. vector <int> vec;  
  66. int arr[maxn];  
  67. map <intint> mapper, rmapper;  
  68.   
  69. int main()  
  70. {  
  71.       ios_base::sync_with_stdio(false);  
  72.       cin.tie(nullptr);  
  73.       cout.tie(nullptr);  
  74.   
  75.       #ifndef ONLINE_JUDGE  
  76.             freopen("in.txt""r", stdin);  
  77.       #endif // ONLINE_JUDGE  
  78.   
  79.       int n;  
  80.       cin >> n;  
  81.       for (int i = 1; i <= n; i++)  
  82.       {  
  83.             cin >> arr[i];  
  84.             vec.emplace_back(arr[i]);  
  85.       }  
  86.       int q;  
  87.       cin >> q;  
  88.       for (int i = 1; i <= q; i++)  
  89.       {  
  90.             int type;  
  91.             cin >> type;  
  92.             if (type == 1)  
  93.             {  
  94.                   int v;  
  95.                   cin >> v;  
  96.                   queries.emplace_back(type, v);  
  97.                   vec.emplace_back(v);  
  98.             }  
  99.             else if (type == 2)  
  100.             {  
  101.                   queries.emplace_back(type);  
  102.             }  
  103.             else  
  104.             {  
  105.                   int l, r, k;  
  106.                   cin >> l >> r >> k;  
  107.                   queries.emplace_back(type, 0, l, r, k);  
  108.             }  
  109.       }  
  110.       sort(vec.begin(), vec.end());  
  111.       int ptr = 0;  
  112.       for (int x : vec)  
  113.       {  
  114.             if (mapper.find(x) == mapper.end())  
  115.             {  
  116.                   mapper[x] = ++ptr;  
  117.                   rmapper[ptr] = x;  
  118.             }  
  119.       }  
  120.       init();  
  121.       for (int i = 1; i <= n; i++)  
  122.       {  
  123.             arr[i] = mapper[ arr[i] ];  
  124.             version[i] = update(version[i-1], 1, N, arr[i], 1);  
  125.       }  
  126.       int lastVersion = n;  
  127.       for (Query &it : queries)  
  128.       {  
  129.             if (it.type == 1)  
  130.             {  
  131.                   it.v = mapper[it.v];  
  132.                   int newVersion = lastVersion + 1;  
  133.                   version[newVersion] = update(version[lastVersion], 1, N, it.v, 1);  
  134.                   lastVersion = newVersion;  
  135.             }  
  136.             else if (it.type == 2)  
  137.             {  
  138.                   --lastVersion;  
  139.             }  
  140.             else  
  141.             {  
  142.                   int l = it.l;  
  143.                   int r = it.r;  
  144.                   int k = it.k;  
  145.                   k = (r - l + 1) - k + 1;  
  146.                   int kth = query(version[l-1], version[r], 1, N, k);  
  147.                   cout << rmapper[kth] << endl;  
  148.             }  
  149.       }  
  150. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.