Pagini recente » Cod sursa (job #916226) | Cod sursa (job #1077222) | Cod sursa (job #3131003) | Borderou de evaluare (job #1332912) | Cod sursa (job #2462120)
#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);
}