Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma optimization_level 3
- #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
- //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- //#pragma GCC target("avx,avx2,fma")
- #include<bits/stdc++.h>
- #define F first
- #define S second
- #define vec vector
- #define ms multiset
- #define pb push_back
- #define pll pair<ll,ll>
- #define pdd pair<ld, ld>
- #define pq priority_queue
- #define umap unordered_map
- #define uset unordered_set
- #define pii pair<int, int>
- #define pnn pair<Node*, Node*>
- #define uid uniform_int_distribution
- #define FILE ifstream in("sumsqr.in");ofstream out("sumsqr.out");
- #define fast cin.tie(0);cout.tie(0);cin.sync_with_stdio(0);cout.sync_with_stdio(0);
- using namespace std;
- typedef string str;
- typedef long long ll;
- typedef long double ld;
- mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()); //uid<int> u1(5, 10); u1(rnd);
- struct Node{
- Node *l=0, *r = 0;
- int x,y,sz=0;
- Node(int val){
- x = val;
- sz = 1;
- y = rnd();
- }
- Node(Node *n){
- l = n->l, r = n->r;
- x = n->x, y = n->y;
- sz = n->sz;
- }
- };
- int gsz(Node *n){return n ? n->sz : 0;}
- void upd(Node *n){
- if(n) n->sz = gsz(n->l)+1+gsz(n->r);
- }
- Node* pers_merge(Node *l, Node *r){
- if(!l) return new Node(r);
- if(!r) return new Node(l);
- Node *nl = new Node(l);
- Node *nr = new Node(r);
- if(nl->y > nr->y){
- nl->r = pers_merge(nl->r, nr); upd(nl);
- return nl;
- }
- nr->l = pers_merge(nl, nr->l); upd(nr);
- return nr;
- }
- Node* merge(Node *l, Node *r){
- if(!l) return r;
- if(!r) return l;
- if(l->y > r->y){
- l->r = merge(l->r, r); upd(l);
- return l;
- }
- r->l = merge(l, r->l); upd(r);
- return r;
- }
- pnn pers_split_sz(Node *n, int sz){
- if(!n) return {0,0};
- Node *u = new Node(n);
- if(sz <= gsz(u->l)){
- pnn p = pers_split_sz(u->l, sz);
- u->l = p.S; upd(u);
- p.S = u;
- return p;
- }
- pnn p = pers_split_sz(u->r, sz-1-gsz(u->l));
- u->r = p.F; upd(u);
- p.F = u;
- return p;
- }
- pnn split_sz(Node *n, int sz){
- if(!n) return {0,0};
- if(sz <= gsz(n->l)){
- pnn p = split_sz(n->l, sz);
- n->l = p.S; upd(n);
- p.S = n;
- return p;
- }
- pnn p = split_sz(n->r, sz-1-gsz(n->l));
- n->r = p.F; upd(n);
- p.F = n;
- return p;
- }
- Node* pers_add(Node *n, int pos, int x){
- pnn p = pers_split_sz(n, pos-1);
- return pers_merge(pers_merge(p.F, new Node(x)), p.S);
- }
- Node* add(Node *n, int pos, int x){
- pnn p = split_sz(n, pos-1);
- return merge(merge(p.F, new Node(x)), p.S);
- }
- int get(Node *n, int pos){
- if(pos <= gsz(n->l)) return get(n->l, pos);
- if(pos==gsz(n->l)+1) return n->x;
- return get(n->r, pos-1-gsz(n->l));
- }
- Node* Ctrl_C_Ctrl_V(Node *n, int l, int r){
- pnn p = pers_split_sz(n, r), p1 = pers_split_sz(p.F, l-1);
- return pers_merge(pers_merge(pers_merge(p1.F, p1.S), p.S), p1.S);
- }
- void print(Node *n){
- if(!n) return;
- print(n->l);
- cout<<n->x<<" ";
- print(n->r);
- }
- int main(){
- fast; FILE;
- vec<Node*> store = {0};
- for(int it=0; it<100; it++){
- str t; int vers; cin>>t>>vers;
- if(t=="a"){
- int pos, VAL; cin>>pos>>VAL;
- store.pb(pers_add(store[vers], pos, VAL));
- }
- if(t=="g"){
- int val; cin>>val;
- cout<<"RES: "<<get(store[vers], val)<<endl;
- }
- if(t=="go"){
- int l,r; cin>>l>>r;
- store.pb(Ctrl_C_Ctrl_V(store[vers], l, r));
- }
- if(t=="a" || t=="go"){
- for(int q=0; q<store.size(); q++){
- cout<<q<<": "; print(store[q]);
- cout<<endl;
- }
- }
- }
- }
- a 0 1 2
- a 0 1 4
- a 1 1 9
- a 3 2 10
- a 4 2 8
- a 0 1 10
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement