Cod sursa(job #2380438)

Utilizator farhad13Farhad Azimov farhad13 Data 14 martie 2019 21:56:01
Problema Secv8 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ill;
#define fr first
#define sc second
#define pb push_back
#define mp make_pair
#define mod 1000000007
#define all(x) x.begin(),x.end()
#define endl "\n"
struct treap
{
    int pr,cnt;
    treap *l,*r;
      bool add;

    treap(){}
    treap(int pr):pr(pr),l(0),r(0),add(0){}
};

int cnt_(treap *t)
{
    return t?t->cnt:0;
}
void upd_cnt(treap *&t)
{
    if(t)t->cnt=cnt_(t->l)+cnt_(t->r)+1;
}
void push_(treap *&t)
{
    if(t)
        if(t->add)
    {
        t->add=0;
        swap(t->l,t->r);
       if(t->l) t->l->add^=1;
        if(t->r)t->r->add^=1;
    }
}
void merge_(treap *l,treap *r,treap  *&t)
{
    push_(l);
    push_(r);
    if(!l||!r)t=l?l:r;
    else if(l->pr>r->pr)
    merge_(l->r,r,l->r),t=l;
    else merge_(l,r->l,r->l),t=r;
    upd_cnt(t);
}

void split_(treap *t,treap *&l,treap *&r,int key)
{
    push_(t);
    if(!t)l=r=0;
    else if(key>cnt_(t->l))
    split_(t->r,t->r,r,key-1-cnt_(t->l)),l=t;
    else  split_(t->l,l,t->l,key),r=t;
    upd_cnt(l);
    upd_cnt(r);
}

void print(treap *t)
{
    push_(t);
    if(t->l)print(t->l);
    cout<<t->pr<<" ";
    if(t->r)print(t->r);
}

void insert_(treap *&t,treap *pt,int pos)
{
    treap *t1,*t2;
    split_(t,t1,t2,pos);
    merge_(t1,pt,t1);
    merge_(t1,t2,t);
}

void erase_(treap *&t,int l,int r)
{
    treap *t1,*t2,*t3;
    split_(t,t1,t2,l);
    split_(t2,t2,t3,r-l+1);
    merge_(t1,t3,t);
}
void get(treap *&t ,int pos)
{
    treap *t1,*t2,*t3;
    split_(t,t1,t2,pos);
    split_(t2,t2,t3,1);
    cout<<t2->pr<<endl;
    merge_(t1,t2,t2);
    merge_(t2,t3,t);
}

void rotate_(treap *&t,int l,int r)
{
    treap *t1,*t2,*t3;
    split_(t,t1,t2,l);
    split_(t2,t2,t3,r-l+1);
    t2->add=1;
    merge_(t1,t2,t2);
    merge_(t2,t3,t);
}
int n,m,l,r;
string a;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
treap *tree=new treap;tree=0;

cin>>n>>m;

while(n--)
{
cin>>a;
    if(a=="I"){cin>>l>>r;insert_(tree,new treap(r),l-1);}
    else if(a=="R"){cin>>l>>r;rotate_(tree,l-1,r-1);}
    else if(a=="A"){cin>>l;get(tree,l-1);}
    else if(a=="D"){cin>>l>>r;erase_(tree,l-1,r-1);}

}
print(tree);
cout<<endl;
return 0;
}