Cod sursa(job #2236202)

Utilizator patcasrarespatcas rares danut patcasrares Data 28 august 2018 16:50:34
Problema Secv8 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.98 kb
#include<fstream>
#include<algorithm>
#include<ctime>
#include<iostream>
#define DN 300005
#define x first
#define y second
using namespace std;
ifstream fin("secv8.in");
ofstream fout("secv8.out");
int q,type,f,g,p,n,ma;
char ch;
struct treap
{
    int nrc=0,pr=0,r=0,val=0;
    treap *ls=0,*ld=0;

};
treap *t,*nil;
void update(treap *&nod)
{
    if(nod==nil)
        return;
    if(nod->ls!=nil)
        nod->ls->r^=nod->r;
    if(nod->ld!=nil)
        nod->ld->r^=nod->r;
    if(nod->r==1)
    {
        nod->r=0;
        treap *f=nod->ls;
        nod->ls=nod->ld;
        nod->ld=f;
    }
    nod->nrc=1;
    if(nod->ls!=nil)
        nod->nrc+=nod->ls->nrc;
    if(nod->ld!=nil)
        nod->nrc+=nod->ld->nrc;
}
void rot1(treap *&nod)
{
    treap *f=nod->ls;
    nod->ls=f->ld;
    f->ld=nod;
    nod=f;
}
void rot2(treap *&nod)
{
    treap *f=nod->ld;
    nod->ld=f->ls;
    f->ls=nod;
    nod=f;
}
void balance(treap *&nod)
{
    if(nod->ls->pr>nod->pr)
        rot1(nod);
    else
        if(nod->ld->pr>nod->pr)
            rot2(nod);
        else
            update(nod);
}
void ins(treap *&nod,int f,int g,int p)
{
    if(nod==nil)
    {
        nod=new treap;
        nod->nrc=1;
        nod->ls=nod->ld=nil;
        nod->val=f;
        nod->pr=p;
        return;
    }

    update(nod);
    update(nod->ls);
    update(nod->ld);
    if(nod->ls->nrc>=g)
        ins(nod->ls,f,g,p);
    else
    {
        g-=nod->ls->nrc+1;
        ins(nod->ld,f,g,p);
    }
    balance(nod);
}
void gaseste(treap *&nod,int f)
{
    int g=1;
    update(nod);
    update(nod->ls);
    update(nod->ld);
    if(nod->ls!=nil)
        g+=nod->ls->nrc;
 //   cout<<f<<' '<<g<<' '<<nod->nrc<<'\n';
    // cout<<f<<' '<<g<<' '<<nod->nrc<<'\n';
    if(g==f)
    {
        fout<<nod->val<<' ';
        return;
    }
    if(nod->ls->nrc>=f)
        gaseste(nod->ls,f);
    else
    {
        f-=g;
        gaseste(nod->ld,f);
    }
}
void sterge(treap *&nod)
{
    update(nod);
    update(nod->ls);
    update(nod->ld);
    if(nod->ls==nil&&nod->ld==nil)
    {
        //cout<<nod->pr<<"x ";
        delete nod;
        nod=nil;
        return;
    }
    if(nod->ls->pr>nod->ld->pr)
    {
    //  cout<<'y';
    //  cout<<nod->ls->pr<<' ';
        rot1(nod);
      //  cout<<nod->ls->val<<' ';
        sterge(nod->ld);
    }
    else
    {
        rot2(nod);
       // cout<<nod->ld->pr<<' ';
        sterge(nod->ls);
    }
    update(nod);
}
void rev(int f,int g)
{
    p=ma+2;
    //cout<<p<<'\n';
    ins(t,0,f-1,p);
    p=ma+1;
    ins(t->ld,0,g-f+1,p);
    t->ld->ls->r^=1;
   // cout<<t->pr<<' ';
    sterge(t);
  //  cout<<t->pr<<' ';
    sterge(t);
}
void stergetot(treap *&nod)
{
    if(nod==nil)
        return;
    //cout<<nod->val<<'\n';
    stergetot(nod->ls);
    stergetot(nod->ld);
    delete nod,nod=nil;
}
void del(int f,int g)
{
    p=ma+2;
    ins(t,0,f-1,p);
    p=ma+1;
    ins(t,0,g+1,p);
    ins(t->ld,0,g-f+1,p);
    stergetot(t->ld->ls);
    sterge(t);
    sterge(t);
}
void afis(treap *&nod)
{
    update(nod);
    update(nod->ls);
    update(nod->ld);
    if(nod==nil)
        return;
    afis(nod->ls);
    fout<<nod->val<<' ';
    //cout<<nod->val<<' ';
    afis(nod->ld);
}
int main()
{
    t=nil=new treap;
    srand(time(0));
    t->ls=t->ld=nil->ls=nil->ld=nil;
    fin>>q>>type;
    while(q--)
    {
        fin>>ch;
        if(ch=='I')
        {
            fin>>g>>f;
            n++;
            p=rand()+1;
            ma=max(ma,p);
            ins(t,f,g-1,p);
            continue;
        }
        if(ch=='A')
        {
            fin>>f;
            gaseste(t,f);
            fout<<'\n';
       //     cout<<'\n';
            continue;
        }
        if(ch=='R')
        {
            fin>>f>>g;
            rev(f,g);
            continue;
        }
        fin>>f>>g;
        del(f,g);
        n-=g-f+1;
    }
    afis(t);
}