Cod sursa(job #2062985)

Utilizator Bodo171Bogdan Pop Bodo171 Data 10 noiembrie 2017 23:37:50
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3 kb
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
struct Treap
{
    int val,w,rev,pr;
    Treap *ls,*rs;
    Treap()
    {
        ls=rs=0;
        val=w=rev=pr=0;
    }
}*R=0,*nil=new Treap;
ifstream f("secv8.in");
ofstream g("secv8.out");
int n,op,i,value,poz,st,dr,pozitia,costul;
char tip;
void pushT(Treap* &nod)
{
    if(nod==0) return;
    if(nod->rev)
    {
        swap(nod->ls,nod->rs);
        if(nod->ls!=0) nod->ls->rev^=1;
        if(nod->rs!=0) nod->rs->rev^=1;
        nod->rev=0;
    }
}
void countT(Treap* &nod)
{
    if(nod==0) return;
    nod->w=1;
    if(nod->ls) nod->w+=nod->ls->w;
    if(nod->rs) nod->w+=nod->rs->w;
}
void mergeT(Treap* &T,Treap* l,Treap* r)
{
    if(l==0) {T=r;return;}
    if(r==0) {T=l;return;}
    pushT(l);pushT(r);
    if(l->pr>r->pr) mergeT(l->rs,l->rs,r),T=l;
    else mergeT(r->ls,l,r->ls),T=r;
    countT(T);
}
void splitT(Treap* T,Treap* &l,Treap* &r,int poz,int cost)
{
    if(T==0) {l=r=0;return;}
    pushT(T);
    int cnt=cost;
    if(T->ls!=0) cnt+=T->ls->w;
    if(cnt>=poz) {splitT(T->ls,l,T->ls,poz,cost);r=T;}
    else {splitT(T->rs,T->rs,r,poz,cnt+1);l=T;}
    countT(l);countT(r);
}
void ins()
{
    Treap *T,*T1=0,*T2=0;
    T=new Treap;
    T->w=1;
    T->pr=rand();T->val=value;
    if(poz==1)
    {
        mergeT(R,T,R);
        return;
    }
    if(poz<=R->w)
    {
        splitT(R,T1,T2,poz-1,0);
        mergeT(R,T1,T);
        mergeT(R,R,T2);
    }
    else
    {
       mergeT(R,R,T);
    }
}
void prop(Treap* &T)
{
    pushT(T);
    if(T->rs==0) {g<<T->val<<'\n';return;}
    prop(T->rs);
}
void find_kth(Treap* &T)
{
    pushT(T);
    int cnt=costul;
    if(T->ls) cnt+=T->ls->w;
    if(cnt<=pozitia)
    {
        costul=cnt;
        if(pozitia==costul)
        {
            prop(T->ls);
            return;
        }
        costul++;
        if(pozitia==costul)
        {
            g<<T->val<<'\n';
            return;
        }
        find_kth(T->rs);
    }
    else find_kth(T->ls);
}
void afis(Treap* &T)
{
    if(T==0) return;
    pushT(T);
    afis(T->ls);
    g<<T->val<<' ';
    afis(T->rs);
}
void rev()
{
    Treap *T1=0,*T2=0,*T3=0,*T4=0;
    splitT(R,T1,T2,st-1,0);
    splitT(T2,T3,T4,dr-st+1,0);
    T3->rev^=1;
    mergeT(R,T1,T3);
    mergeT(R,R,T4);

}
void del()
{
    Treap *T1,*T2,*T3,*T4;
    splitT(R,T1,T2,st-1,0);
    splitT(T2,T3,T4,dr-st+1,0);
    mergeT(R,T1,T4);
}
int main()
{
    f>>n>>op;
    srand(time(NULL));
    for(i=1;i<=n;i++)
    {
        f>>tip;
        if(tip=='I')
        {
            f>>poz>>value;
            ins();
        }
        if(tip=='A')
        {
            f>>pozitia;costul=0;
            find_kth(R);
        }
        if(tip=='R')
        {
            f>>st>>dr;
            rev();
        }
        if(tip=='D')
        {
            f>>st>>dr;
            del();
        }
    }
    afis(R);
    return 0;
}