Cod sursa(job #2242991)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 19 septembrie 2018 19:53:56
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.17 kb
#include <fstream>

using namespace std;

ifstream fin ("secv8.in");
ofstream fout ("secv8.out");

struct Treap {
    int val,w,rev,pr;
    Treap *ls,*rs;
    Treap()   {
        ls=rs=0;
        val=w=rev=pr=0;
    }
}*R=0,*nil=new Treap;

int n,op,i,value,poz,st,dr,pozitia,costul;
char tip;
void Update(Treap *& nod);
void countT(Treap* &nod);
void mergeT(Treap* &T,Treap* l,Treap* r);
void splitT(Treap* T,Treap* &l,Treap* &r,int poz,int cost);
void ins();
void prop(Treap* &T);
void find_kth(Treap* &T);
void afis(Treap* &T);
void del();
void rev();

int main()
{
    fin >> n >> op;
    srand(time(nullptr));
    for(i = 1;i <= n; ++i)   {
        fin >> tip;
        if(tip == 'I') {
            fin >> poz >> value;
            ins();
        }
        if(tip == 'A') {
            fin >>pozitia;
            costul=0;
            find_kth(R);
        }
        if(tip == 'R'){
            fin >> st >> dr;
            rev();
        }
        if(tip=='D') {
            fin >> st >> dr;
            del();
        }
    }
    afis(R);
    return 0;
}

void Update(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;
	}
    Update(l);Update(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;}
    Update(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) {
    Update(T);
    if(T->rs == 0) {fout << T->val <<'\n';
		return;
		}
    prop(T->rs);
}
void find_kth(Treap* &T)
{
    Update(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)
        {
            fout<<T->val<<'\n';
            return;
        }
        find_kth(T->rs);
    }
    else find_kth(T->ls);
}
void afis(Treap* &T)
{
    if(T == 0) return;
    Update(T);
    afis(T->ls);
    fout << 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);
}