Cod sursa(job #1985060)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 26 mai 2017 19:07:52
Problema Secv8 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.75 kb
#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f=fopen("secv8.in","r");
FILE *g=fopen("secv8.out","w");
struct treap
{
    int key,prio,sz;
    bool rev;
    treap *l,*r;
    treap(int k,int p,int s,bool R,treap* a,treap* b)
    {
        key=k;
        prio=p;
        sz=s;
        rev=R;
        l=a;
        r=b;
    }
}*T,*nill;
void refrsize(treap* &T)
{
    if(T==nill)return;
    T->sz=T->l->sz+1+T->r->sz;
}
void refrrev(treap* &T)
{
    if(T==nill||!T->rev)return;
    T->rev=0;
    swap(T->l,T->r);
    T->l->rev^=1;
    T->r->rev^=1;
}
void rotst(treap* &T)
{
    treap* tmp;
    tmp=T->l;
    T->l=tmp->r;
    tmp->r=T;
    T=tmp;
    refrsize(T->r);
    refrsize(T);
}
void rotdr(treap* &T)
{
    treap* tmp;
    tmp=T->r;
    T->r=tmp->l;
    tmp->l=T;
    T=tmp;
    refrsize(T);
    refrsize(T->l);
}
int fi(treap* &T,int pos)
{
    if(T==nill)return 0;
    else if(T->l->sz+1==pos)return T->key;
    else if(T->l->sz+1>pos)return fi(T->l,pos);
    else return fi(T->r,pos-T->l->sz-1);
}
void balance(treap* &T)
{
    refrsize(T);
    refrrev(T);
    refrrev(T->l);
    refrrev(T->r);
    if(T->prio<T->l->prio)rotst(T);
    else if(T->prio<T->r->prio)rotdr(T);
}
void ins(treap* &T,int pos,int key,int prio)
{
    if(T==nill)
    {
        T=new treap(key,prio,1,0,nill,nill);
        return;
    }
    refrrev(T);
    T->sz++;
    if(pos<=T->l->sz+1)ins(T->l,pos,key,prio);
    else ins(T->r,pos-T->l->sz-1,key,prio);
    balance(T);
}
void del(treap* &T,int pos)
{
    if(T->l==nill&&T->r==nill)
    {
        delete T;
        T=nill;
        return ;
    }
    if(T->l->sz+1==pos)
    {
        if(T->l->prio<T->r->prio)
        {
            refrrev(T);
            refrrev(T->r);
            rotdr(T);
            del(T->l,T->l->l->sz+1);
        }
        else
        {
            refrrev(T);
            refrrev(T->l);
            rotst(T);
            del(T->r,T->r->l->sz+1);
        }
    }
    else if(T->l->sz+1>pos)
    {
        del(T->l,pos);
    }
    else
    {
        del(T->r,pos-1-T->l->sz);
    }
    refrsize(T);
}
treap* join(treap* &T1,treap* &T2)
{
    treap* t=new treap(0,1,1,0,T1,T2);
    del(t,t->l->sz+1);
    return t;
}
pair<treap*,treap*> split(treap* &T,int pos)
{
    treap *a,*b;
    ins(T,pos,0,1<<30);
    a=T->l;
    b=T->r;
    return {a,b};
}
void rev(treap* &T,int x,int y)
{
    pair<treap*,treap*> tmp;
    treap *T1,*T2,*T3;
    tmp=split(T,y+1);
    T3=tmp.second;
    T2=tmp.first;
    tmp=split(T2,x);
    T2=tmp.second;
    T1=tmp.first;
    T2->rev^=1;
    T=join(T1,T2);
    T=join(T,T3);
}
void de(treap* &T,int x,int y)
{
    pair<treap*,treap*> tmp;
    treap *T1,*T2,*T3;
    tmp=split(T,y+1);
    T3=tmp.second;
    T2=tmp.first;
    tmp=split(T2,x);
    T2=tmp.second;
    T1=tmp.first;
    T2->rev^=1;
    T=join(T1,T3);
}
char C;
int x,y;
int N,M;
void print(treap* &T)
{
    if(T==nill)return ;
    refrrev(T);
    print(T->l);
    fprintf(g,"%d ",T->key);
    print(T->r);
}
int main()
{
    nill=new treap(0,0,0,0,NULL,NULL);
    T=nill;
    fscanf(f,"%d %d\n",&N,&M);
    for(int i=1;i<=N;i++)
    {
        fscanf(f,"%c",&C);
        if(C=='I')
        {
            fscanf(f,"%d %d\n",&x,&y);
            ins(T,x,y,rand());
        }
        else if(C=='A')
        {
            fscanf(f,"%d\n",&x);
            fprintf(g,"%d\n",fi(T,x));
        }
        else if(C=='R')
        {
            fscanf(f,"%d %d\n",&x,&y);
            //rev(T,x,y);
        }
        else if(C=='D')
        {
            fscanf(f,"%d %d\n",&x,&y);
            de(T,x,y);
        }
    }
    print(T);
    fclose(f);
    fclose(g);
    return 0;
}