Cod sursa(job #1037767)

Utilizator geniucosOncescu Costin geniucos Data 20 noiembrie 2013 18:44:46
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.47 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
int Sol,op,i,j,INS,INF,poz,V;
char tip;
struct T
{
    int nr,K,P;
    bool rev;
    T *l,*r;
    T(int K,int P,int nr,bool rev,T *l,T *r)
    {
        this->P=P;
        this->K=K;
        this->nr=nr;
        this->rev=rev;
        this->l=l;
        this->r=r;
    }
}*R,*nil,*p1,*p2,*p3,*aux;

int Rand() {return ((rand()%32768)<<15)+(rand()%32768)+1;}

void Splitrev(T *&n)
{
    if(n->rev==0) return ;
    n->rev=0;
    T *aux=n->l;
    n->l=n->r;
    n->r=aux;
    n->l->rev^=1;
    n->r->rev^=1;
}

void reup(T *&n)
{
    n->nr=n->l->nr+n->r->nr+1;
}

void rotleft(T *&n)
{
    T *t=n->l;
    n->l=t->r;t->r=n;
    reup(n);
    reup(t);
    n=t;
}

void rotright(T *&n)
{
    T *t=n->r;
    n->r=t->l;t->l=n;
    reup(n);
    reup(t);
    n=t;
}

void balance(T *&n)
{
    Splitrev(n);
    if(n->l->P>n->P)
    {
        Splitrev(n->l);
        rotleft(n);
    }
    else
    if(n->r->P>n->P)
    {
        Splitrev(n->r);
        rotright(n);
    }
}

void Insert(T *&n,int Poz,int K,int P)
{
    if(n==nil)
    {
        n=new T(K,P,1,0,nil,nil);
        return ;
    }
    Splitrev(n);
    if(n->l->nr>=Poz) Insert(n->l,Poz,K,P);
    else Insert(n->r,Poz-n->l->nr-1,K,P);
    reup(n);
    balance(n);
}

void Erase(T *&n,int Poz)
{
    Splitrev(n);
    if(n->l->nr>=Poz) Erase(n->l,Poz);
    else
    if(n->l->nr+1<Poz) Erase(n->r,Poz-n->l->nr-1);
    else
    {
        if(n->l==nil&&n->r==nil)
        {
            delete n;
            n=nil;
        }
        else
        {
            if(n->l->P>n->r->P)
            {
                Splitrev(n->l);
                rotleft(n);
            }
            else
            {
                Splitrev(n->r);
                rotright(n);
            }
            Erase(n,Poz);
        }
    }
    if(n!=nil) reup(n);
}

void acces(T *&n,int Poz)
{
    Splitrev(n);
    if(n->l->nr>=Poz) acces(n->l,Poz);
    else
    if(n->l->nr+1<Poz) acces(n->r,Poz-n->l->nr-1);
    else
    {
        Sol=n->K;
        return ;
    }
}

void Split(T *&R,T *&Rl,T *&Rr,int Poz)
{
    Insert(R,Poz,0,INF);
    Rl=R->l;
    Rr=R->r;
    delete R;R=nil;
}

void Join(T *&R,T *&Rl,T *&Rr)
{
    R=new T(0,0,Rl->nr+Rr->nr+1,0,Rl,Rr);
    Erase(R,Rl->nr+1);
}

void afis(T *&R)
{
    if(R==nil) return ;
    Splitrev(R);
    afis(R->l);
    printf("%d ",R->K);
    afis(R->r);
}

int main()
{
freopen("secv8.in","r",stdin);
freopen("secv8.out","w",stdout);
srand(time(0));
scanf("%d",&op);
scanf("%d\n",&i);
INF=(1<<30)+5;INS=0;
nil=new T(0,0,0,0,0,0);
while(op)
{
    op--;
    scanf("%c ",&tip);
    if(tip=='I')
    {
        scanf("%d",&poz);
        scanf("%d",&V);
        INS++;
        if(INS==1) R=new T(V,Rand(),1,0,nil,nil);
        else Insert(R,poz-1,V,Rand());
    }
    else
    if(tip=='A')
    {
        scanf("%d",&poz);
        acces(R,poz);
        printf("%d\n",Sol);
    }
    else
    if(tip=='R')
    {
        scanf("%d",&i);
        scanf("%d",&j);
        Split(R,aux,p3,j);
        Split(aux,p1,p2,i-1);
        p2->rev^=1;
        Join(aux,p1,p2);
        Join(R,aux,p3);
    }
    else
    if(tip=='D')
    {
        scanf("%d",&i);
        scanf("%d",&j);
        Split(R,aux,p3,j);
        Split(aux,p1,p2,i-1);
        Join(R,p1,p3);
    }
    scanf("\n");
}
afis(R);
printf("\n");
return 0;
}