Cod sursa(job #2021185)

Utilizator danstefanDamian Dan Stefan danstefan Data 12 septembrie 2017 20:19:35
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.57 kb
#include <bits/stdc++.h>
#define MOD 666013
#define inf (1<<30)+10
using namespace std;
int t,inutil,le,re,poz,val,INF,sol;
char op;
bool ok;
struct Treap
{
    int K,P,nr;
    bool rev;
    Treap *l,*r;
    Treap(int K1,int P1,int nr1,bool rev1,Treap *l1,Treap *r1)
    {
        K=K1;
        P=P1;
        nr=nr1;
        rev=rev1;
        l=l1;
        r=r1;
    }
}*R,*nil,*t1,*t2,*t3,*aux;
void Rev_verif(Treap *&R)
{
    if(R->rev==0)return ;
    R->rev=0;
    Treap *var=R->l;
    R->l=R->r;
    R->r=var;
    R->l->rev^=1;
    R->r->rev^=1;
}
void reup(Treap *&R)
{
    R->nr=R->l->nr+R->r->nr+1;
}
void rotleft(Treap *&R)
{
    Treap *t=R->l;
    R->l=t->r;
    t->r=R;
    reup(R);
    reup(t);
    R=t;
}
void rotright(Treap *&R)
{
    Treap *t=R->r;
    R->r=t->l;
    t->l=R;
    reup(R);
    reup(t);
    R=t;
}
void balance(Treap *&R)
{
    Rev_verif(R);
    if(R->l->P>R->P)
    {
        Rev_verif(R->l);
        rotleft(R);
    }
    else if(R->r->P>R->P)
    {
        Rev_verif(R->r);
        rotright(R);
    }
}
void inserare(Treap *&R,int poz,int k, int pr)
{
    if(R==nil)
    {
        R=new Treap(k,pr,1,0,nil,nil);
        return ;
    }
    Rev_verif(R);
    if(R->l->nr>=poz)inserare(R->l,poz,k,pr);
    else inserare(R->r,poz-R->l->nr-1,k,pr);
    reup(R);
    balance(R);
}
void acces(Treap *&R,int poz)
{
    Rev_verif(R);
    if(R->l->nr>=poz)acces(R->l,poz);
    else if(R->l->nr+1<poz)acces(R->r,poz-R->l->nr-1);
    else
    {
        sol=R->K;
        return ;
    }
}
void sterge(Treap *&R,int poz)
{
    Rev_verif(R);
    if(R->l->nr>=poz)sterge(R->l,poz);
    else if(R->l->nr+1<poz)sterge(R->r,poz-R->l->nr-1);
    else
    {
        if(R->l==nil&&R->r==nil)
        {
            delete R;
            R=nil;
        }
        else
        {
            if(R->l->P>R->r->P)
            {
                Rev_verif(R->l);
                rotleft(R);
            }
            else
            {
                Rev_verif(R->r);
                rotright(R);
            }
            sterge(R,poz);
        }
    }
    if(R!=nil)reup(R);
}
void split(Treap *&R,Treap *&ts,Treap *&td,int poz)
{
    inserare(R,poz,0,inf);
    ts=R->l;
    td=R->r;
    delete R;R=nil;
}
void join(Treap *&R,Treap *&ts,Treap *&td)
{
    R= new Treap(0,0,ts->nr+td->nr+1,0,ts,td);
    sterge(R,ts->nr+1);
}
void scrie(Treap *&R)
{
    if(R==nil)return ;
    Rev_verif(R);
    scrie(R->l);
    printf("%d ",R->K);
    scrie(R->r);
}
int main()
{
    freopen("secv8.in","r",stdin);
    freopen("secv8.out","w",stdout);
    scanf("%d%d",&t,&inutil);
    srand(time(0));
    nil=new Treap(0,0,0,0,0,0);
    ok=false;
    while(t--)
    {
        scanf("\n%c",&op);
        if(op=='I')
        {
            scanf("%d%d",&poz,&val);
            if(!ok)R = new Treap(val,rand()%MOD+1,1,0,nil,nil);
            else inserare(R,poz-1,val,rand()%MOD+1);
            ok=true;
        }
        else if(op=='A')
        {
            scanf("%d",&poz);
            acces(R,poz);
            printf("%d\n",sol);
        }
        else if(op=='R')
        {
            scanf("%d%d",&le,&re);
            split(R,aux,t3,re);
            split(aux,t1,t2,le-1);
            t2->rev^=1;
            join(aux,t1,t2);
            join(R,aux,t3);
        }
        else if(op=='D')
        {
            scanf("%d%d",&le,&re);
            split(R,aux,t3,re);
            split(aux,t1,t2,le-1);
            join(R,t1,t3);
        }
    }
    scrie(R);
    return 0;
}