Advertisement
Guest User

Untitled

a guest
Feb 18th, 2020
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.86 KB | None | 0 0
  1. #pragma optimization_level 3
  2. #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
  3. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  4. //#pragma GCC target("avx,avx2,fma")
  5. #include<bits/stdc++.h>
  6. #define F first
  7. #define S second
  8. #define vec vector
  9. #define ms multiset
  10. #define pb push_back
  11. #define pll pair<ll,ll>
  12. #define pdd pair<ld, ld>
  13. #define pq priority_queue
  14. #define umap unordered_map
  15. #define uset unordered_set
  16. #define pii pair<int, int>
  17. #define pnn pair<Node*, Node*>
  18. #define uid uniform_int_distribution
  19. #define FILE ifstream in("sumsqr.in");ofstream out("sumsqr.out");
  20. #define fast cin.tie(0);cout.tie(0);cin.sync_with_stdio(0);cout.sync_with_stdio(0);
  21. using namespace std;
  22. typedef string str;
  23. typedef long long ll;
  24. typedef long double ld;
  25. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()); //uid<int> u1(5, 10); u1(rnd);
  26.  
  27. struct Node{
  28.     Node *l=0, *r = 0;
  29.     int x,y,sz=0;
  30.  
  31.     Node(int val){
  32.         x = val;
  33.         sz = 1;
  34.         y = rnd();
  35.     }
  36.  
  37.     Node(Node *n){
  38.         l = n->l, r = n->r;
  39.         x = n->x, y = n->y;
  40.         sz = n->sz;
  41.     }
  42. };
  43.  
  44. int gsz(Node *n){return n ? n->sz : 0;}
  45. void upd(Node *n){
  46.     if(n) n->sz = gsz(n->l)+1+gsz(n->r);
  47. }
  48.  
  49. Node* pers_merge(Node *l, Node *r){
  50.     if(!l) return new Node(r);
  51.     if(!r) return new Node(l);
  52.     Node *nl = new Node(l);
  53.     Node *nr = new Node(r);
  54.     if(nl->y > nr->y){
  55.         nl->r = pers_merge(nl->r, nr); upd(nl);
  56.         return nl;
  57.     }
  58.     nr->l = pers_merge(nl, nr->l); upd(nr);
  59.     return nr;
  60. }
  61.  
  62. Node* merge(Node *l, Node *r){
  63.     if(!l) return r;
  64.     if(!r) return l;
  65.     if(l->y > r->y){
  66.         l->r = merge(l->r, r); upd(l);
  67.         return l;
  68.     }
  69.     r->l = merge(l, r->l); upd(r);
  70.     return r;
  71. }
  72.  
  73. pnn pers_split_sz(Node *n, int sz){
  74.     if(!n) return {0,0};
  75.     Node *u = new Node(n);
  76.     if(sz <= gsz(u->l)){
  77.         pnn p = pers_split_sz(u->l, sz);
  78.         u->l = p.S; upd(u);
  79.         p.S = u;
  80.         return p;
  81.     }
  82.     pnn p = pers_split_sz(u->r, sz-1-gsz(u->l));
  83.     u->r = p.F; upd(u);
  84.     p.F = u;
  85.     return p;
  86. }
  87.  
  88. pnn split_sz(Node *n, int sz){
  89.     if(!n) return {0,0};
  90.     if(sz <= gsz(n->l)){
  91.         pnn p = split_sz(n->l, sz);
  92.         n->l = p.S; upd(n);
  93.         p.S = n;
  94.         return p;
  95.     }
  96.     pnn p = split_sz(n->r, sz-1-gsz(n->l));
  97.     n->r = p.F; upd(n);
  98.     p.F = n;
  99.     return p;
  100. }
  101.  
  102. Node* pers_add(Node *n, int pos, int x){
  103.     pnn p = pers_split_sz(n, pos-1);
  104.     return pers_merge(pers_merge(p.F, new Node(x)), p.S);
  105. }
  106.  
  107. Node* add(Node *n, int pos, int x){
  108.     pnn p = split_sz(n, pos-1);
  109.     return merge(merge(p.F, new Node(x)), p.S);
  110. }
  111.  
  112. int get(Node *n, int pos){
  113.     if(pos <= gsz(n->l)) return get(n->l, pos);
  114.     if(pos==gsz(n->l)+1) return n->x;
  115.     return get(n->r, pos-1-gsz(n->l));
  116. }
  117.  
  118. Node* Ctrl_C_Ctrl_V(Node *n, int l, int r){
  119.     pnn p = pers_split_sz(n, r), p1 = pers_split_sz(p.F, l-1);
  120.     return pers_merge(pers_merge(pers_merge(p1.F, p1.S), p.S), p1.S);
  121. }
  122.  
  123. void print(Node *n){
  124.     if(!n) return;
  125.     print(n->l);
  126.     cout<<n->x<<" ";
  127.     print(n->r);
  128. }
  129.  
  130. int main(){
  131.     fast; FILE;
  132.     vec<Node*> store = {0};
  133.     for(int it=0; it<100; it++){
  134.         str t; int vers; cin>>t>>vers;
  135.         if(t=="a"){
  136.             int pos, VAL; cin>>pos>>VAL;
  137.             store.pb(pers_add(store[vers], pos, VAL));
  138.         }
  139.         if(t=="g"){
  140.             int val; cin>>val;
  141.             cout<<"RES: "<<get(store[vers], val)<<endl;
  142.         }
  143.         if(t=="go"){
  144.             int l,r; cin>>l>>r;
  145.             store.pb(Ctrl_C_Ctrl_V(store[vers], l, r));
  146.         }
  147.         if(t=="a" || t=="go"){
  148.             for(int q=0; q<store.size(); q++){
  149.                 cout<<q<<": "; print(store[q]);
  150.                 cout<<endl;
  151.             }
  152.         }
  153.     }
  154. }
  155.  
  156. a 0 1 2
  157. a 0 1 4
  158. a 1 1 9
  159. a 3 2 10
  160. a 4 2 8
  161. a 0 1 10
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement