Cod sursa(job #2462120)

Utilizator patcasrarespatcas rares danut patcasrares Data 26 septembrie 2019 19:40:32
Problema Secv8 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.54 kb
#include<bits/stdc++.h>
#define DN 100005
#define x first
#define y second
#define pb push_back
using namespace std;
ifstream fin("secv8.in");
ofstream fout("secv8.out");
int q,val,poz,pr,st,dr;
char ch;
struct treap
{
    int val=0,pri=0,rev=0,nrc=0;
    treap *st=0,*dr=0;
    treap(int val2,int pri2,treap *st2,treap *dr2)
    {
        val=val2;
        pri=pri2;
        st=st2;
        dr=dr2;
    }
};
treap *T,*nil;
void rev(treap *&nod)
{
    if(nod==nil)
        return;
    if(nod->rev)
        swap(nod->st,nod->dr);
    if(nod->st!=nil)
        nod->st->rev^=nod->rev;
    if(nod->dr!=nil)
        nod->dr->rev^=nod->rev;
    nod->rev=0;
}
void getdesc(treap *&nod)
{
    nod->nrc=1+nod->st->nrc+nod->dr->nrc;
}
void rot1(treap *&nod)
{
    //cout<<"zz"<<'\n';
    treap *&aux=nod->st;
    rev(nod);
    rev(aux);
    nod->st=aux->dr;
    aux->dr=nod;
    getdesc(nod);
    getdesc(aux);
    nod=aux;
}
void rot2(treap *&nod)
{
    //cout<<'z'<<'\n';
    treap *aux=nod->dr;
    rev(nod);
    rev(aux);
    nod->dr=aux->st;
    aux->st=nod;
    getdesc(nod);
    getdesc(aux);
    nod=aux;
}
void balance(treap *&nod)
{
    if(nod->st->pri<nod->pri)
        rot1(nod);
    else
        if(nod->dr->pri<nod->pri)
            rot2(nod);
        else
            getdesc(nod);
}
void ins(treap *&nod)
{
    rev(nod);
    //cout<<nod->val<<'\n';
    if(nod==nil)
    {
        nod=new treap(val,pr,nil,nil);
        nod->nrc=1;
        //cout<<pr<<'\n';
        //cout<<'k'<<nod->val<<'\n';
        return;
    }
    //cout<<'k'<<nod->val<<'\n';
    if(poz<=1+nod->st->nrc)
        ins(nod->st);
    else
    {
        //cout<<2<<'\n';
        poz-=nod->st->nrc+1;
        ins(nod->dr);
    }
    balance(nod);
}
void query(treap *&nod)
{
    rev(nod);
    if(nod->st->nrc+1==poz)
    {
        fout<<nod->val<<'\n';
        return;
    }
    if(nod->st->nrc>=poz)
        query(nod->st);
    else
    {
        poz-=1+nod->st->nrc;
        query(nod->dr);
    }
}
void afisare(treap *&nod)
{
    if(nod==nil)
    {
        //cout<<'h'<<'\n';
        return;
    }
    //if(nod->st==nil&&nod->dr==nil)
      //  cout<<'h'<<'\n';
    rev(nod);
    if(nod->st!=nil)
        afisare(nod->st);
    fout<<nod->val<<' ';
    if(nod->dr!=nil)
        afisare(nod->dr);
}
void del(treap *&nod)
{
    rev(nod);
    if(nod->st==nil&&nod->dr==nil)
    {
        delete nod;
        nod=nil;
        return;
    }
    if(nod->st->pri<nod->dr->pri)
    {
        rot1(nod);
        del(nod->dr);
    }
    else
    {
        rot2(nod);
        del(nod->st);
    }
    getdesc(nod);
}
void delall(treap *&nod)
{
    rev(nod);
    if(nod==nil)
        return;
    delall(nod->st);
    delall(nod->dr);
    del(nod);
}
void solve()
{
    pr=0;
    poz=dr+1;
    ins(T);
    pr=0;
    poz=st;
    ins(T->st);
    return;
    if(ch=='R')
        T->st->dr->rev^=1;
    else
        delall(T->st->dr);
    del(T->st);
    del(T);
}
int main()
{
    srand(time(0));
    nil=new treap(0,2e9,nil,nil);
    T=nil;
    fin>>q;
    fin>>ch;
    while(q--)
    {
        fin>>ch;
        if(ch=='I')
        {
            fin>>poz>>val;
            pr=1+(1LL*rand()*rand())%((int)1e9);
            ins(T);
            //cout<<T->st->val<<'\n';
            continue;
        }
        if(ch=='A')
        {
            fin>>poz;
            query(T);
            continue;
        }
        fin>>st>>dr;
        solve();
    }
    afisare(T);
}