Cod sursa(job #2477645)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 20 octombrie 2019 20:58:07
Problema Secv8 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.56 kb
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#define INF 1000000000
using namespace std;
ifstream fin ("date.in");
ofstream fout("date.out");
int nr,ok,x,y,t;
char c;
struct T{
    int val;int heap;int n;int rev;
    T *st, *dr;
    T(int val, int heap, T *st, T *dr, int n,int rev)
    {
        this->val=val;
        this->heap=heap;
        this->st=st;this->dr=dr;
        this->n=n;
        this->rev=rev;
    }
} *nod,*nil, *ts, *td, *ta;
void updateReversed(T *nod) {
    if (nod->rev==1&&nod!=nil) {
        nod->st->rev=1-nod->st->rev;
        nod->dr->rev=1-nod->dr->rev;
        T *aux=nod->st;
        nod->st=nod->dr;
        nod->dr=aux;
        nod->rev=0;
    }
}
int Rand()
{
    return 1 + (((rand()%32768)<<15) + rand()%32768 + 1 );
}
void refresh(T *nod) {
    if(nod==nil) nod->n=0;
    else nod->n=nod->st->n+nod->dr->n+1;
}
void turnright(T *&nod) {
    T *t=nod->st;
    nod->st=t->dr;t->dr=nod;
    nod=t;
    refresh(nod->dr);
    refresh(nod);
}
void turnleft(T* &nod) {
    T *t=nod->dr;
    nod->dr=t->st;t->st=nod;
    nod=t;
    refresh(nod->st);
    refresh(nod);
}
void balance(T* &nod) {
    if(nod->st!=NULL&&nod->st->heap>nod->heap) turnright(nod);
    else if(nod->dr!=NULL&&nod->dr->heap>nod->heap) turnleft(nod);
}
void in(T *&nod,int val,int heap,int poz)
{
    if(nod==nil)
    {
        nod=new T(val,heap,nil,nil,1,0);nr++;
        return;
    }
    updateReversed(nod);
    if(nod->st->n>=poz-1) in(nod->st,val,heap,poz);
    else in(nod->dr,val,heap,poz-nod->st->n-1);
    balance(nod);
    refresh(nod);
}
T *acces(T *nod,int poz)
{
    updateReversed(nod);
    refresh(nod);
    if(nod->st->n==poz-1) return nod;
    else if(nod->st->n>poz-1) return acces(nod->st,poz);
    else return acces(nod->dr,poz-nod->st->n-1);

}
void out(T *&nod,int val)
{
    if(nod->st==nil&&nod->dr==nil)
    {
        if(nod->val==val)
        {
            delete nod;
            nod=nil;
        }
    }else{
        updateReversed(nod);
        if(nod->st->heap>nod->dr->heap)
        {
            updateReversed(nod->st);
            turnright(nod);
            out(nod->dr,val);
        }else{
            updateReversed(nod->dr);
            turnleft(nod);
            out(nod->st, val);

        }
        refresh(nod);
    }
}
void split(T *nod,int poz, T *&ts,T *&td)
{
    in(nod,INF,INF,poz);
    ts=nod->st;
    td=nod->dr;
    delete nod;
}
void join(T *&nod, T *ts, T *td)
{
    nod=new T(INF,-1,ts,td,ts->n+td->n,0);
    out(nod,INF);

}
void dfs(T *&nod)
{
    if(nod==nil) return;
    updateReversed(nod);
    refresh(nod);
    dfs(nod->st);
    fout<<nod->val<<" ";
    dfs(nod->dr);
}
int main ()
{
    srand(time(0));
    nod=nil=new T(0, 0, NULL, NULL, 0, 0);
    fin>>t>>ok;
    for(;t--;)
    {
        fin>>c;
        //show(nod,0);cout<<"\n";
        if(c=='I')
        {
            fin>>y;fin>>x;
            in(nod,x,Rand(),y);
        }
        if(c=='A')
        {
            fin>>y;
            ta=acces(nod,y);
            fout<<ta->val<<"\n";
            continue;
        }
        if(c=='D')
        {
            fin>>x>>y;
            split(nod,y+1,ta,td);
            split(ta,x,ts,nod);
            join(nod,ts,td);
        }
        if(c=='R')
        {
            fin>>x>>y;
            split(nod,y+1,ta,td);
            split(ta,x,ts,nod);
            nod->rev = 1;
            join(ta,ts,nod);
            join(nod,ta,td);
        }
    }
    dfs(nod);
    return 0;
}