Cod sursa(job #1998633)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 8 iulie 2017 16:53:16
Problema Secv8 Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.76 kb
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <algorithm>
using namespace std;
FILE *f=fopen("secv8.in","r");
FILE *g=fopen("secv8.out","w");
int N,M,C;
int myrand()
{
    int val=rand()%10000;
    return val+(!val);
}
struct treap{
    int k;
    int p;
    bool rev;
    int sz;
    treap *l,*r;
    treap(int key,int prio,treap* f1,treap*f2,int s)
    {
        rev=0;
        k=key;
        p=prio;
        l=f1;
        r=f2;
        sz=s;
    }
}*nill,*T;
void refrsize(treap* &T)
{
    if(T==nill)return;
    T->sz=T->l->sz+1+T->r->sz;
}
void refrrev(treap* &T)
{
     if(T==nill)return ;
     if(!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=T->l;
     T->l=tmp->r;
     tmp->r=T;
     T=tmp;
     refrsize(T);
     refrsize(T->r);
}
void rotdr(treap* &T)
{
    treap* tmp=T->r;
    T->r=tmp->l;
    tmp->l=T;
    T=tmp;
    refrsize(T);
    refrsize(T->l);
}
void balance(treap* &T)
{
    refrrev(T);
    refrsize(T);
    refrsize(T->l);
    refrsize(T->r);
    if(T->l->p>T->p)rotst(T);
    if(T->r->p>T->p)rotdr(T);
}
void ins(treap* &T,int key,int prio,int pos)
{
    refrrev(T);
    if(T==nill)
    {
        T=new treap(key,prio,nill,nill,1);return ;
    }
    if(pos<=T->l->sz+1)ins(T->l,key,prio,pos);
    else ins(T->r,key,prio,pos-T->l->sz-1);
    balance(T);
}
void del(treap* &T,int pos)
{
    refrrev(T);
    if(T->l==nill&&T->r==nill)
    {
        delete T;
        T=nill;
        return ;
    }
    if(T->l->sz+1==pos)
    {
        if(T->l->p>T->r->p)
        {
            refrrev(T);
            refrrev(T->l);
            rotst(T);
            del(T->r,T->r->l->sz+1);
        }
        else
        {
            refrrev(T);
            refrrev(T->r);
            rotdr(T);
            del(T->l,T->l->l->sz+1);
        }
    }
    refrsize(T);;
}
treap* join(treap* &T1,treap* &T2)
{
    treap* t=new treap(0,1,T1,T2,1);
    del(t,t->l->sz+1);
    return t;
}
pair<treap*,treap*> split(treap* &T,int pos)///[1,pos)
{
    ins(T,'a'-1,1<<30,pos);
    return {T->l,T->r};
}
void M1(int i,int j,int k)
{
    pair<treap*,treap*> tmp,aux;
    tmp=split(T,j+1);
    aux=split(tmp.first,i);
    treap* t;t=join(aux.first,tmp.second);
    tmp=split(t,k+1);
    t=join(tmp.first,aux.second);
    T=join(t,tmp.second);
}
void M2(int i,int j)
{
    pair<treap*,treap*> tmp,aux;
    tmp=split(T,j+1);
    aux=split(tmp.first,i);
    aux.second->rev^=1;
    treap* t=join(aux.first,aux.second);
    T=join(t,tmp.second);
}
void M3(int i,int j)
{
    pair<treap*,treap*> tmp,aux;
    tmp=split(T,j+1);
    aux=split(tmp.first,i);
    T=join(aux.first,tmp.second);
}
int fi(treap* &T,int pos)
{
    if(pos==T->l->sz+1)return T->k;
    if(pos<=T->l->sz)return fi(T->l,pos);
    return fi(T->r,pos-T->l->sz-1);
}
void afis(treap* T)
{
    refrrev(T);
    if(T==nill)return ;
    afis(T->l);
    fprintf(g,"%d ",T->k);
    afis(T->r);
}
int main()
{
    srand(time(NULL));
    T=nill=new treap(0,0,NULL,NULL,0);
    fscanf(f,"%d %d\n",&N,&M);
    for(int i=1;i<=N;i++)
    {
        int x,y;
        fscanf(f,"%c",&C);
        if(C=='I')
        {
            fscanf(f,"%d %d\n",&x,&y);
            ins(T,y,myrand(),x);
        }
        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);
            M2(x,y);
        }
        else if(C=='D')
        {
            fscanf(f,"%d %d\n",&x,&y);
            M3(x,y);
        }
    }
    afis(T);
    fclose(f);
    fclose(g);
    return 0;
}