Pagini recente » Cod sursa (job #2893011) | Cod sursa (job #1623115) | Cod sursa (job #1667944) | Cod sursa (job #996680) | Cod sursa (job #2236181)
#include<fstream>
#include<algorithm>
#include<ctime>
#define DN 300005
#define x first
#define y second
using namespace std;
ifstream fin("secv8.in");
ofstream fout("secv8.out");
int q,type,f,g,p,n,ma;
char ch;
struct treap
{
int nrc=0,pr=0,r=0,val=0;
treap *ls=0,*ld=0;
};
treap *t,*nil;
void update(treap *&nod)
{
if(nod==nil)
return;
if(nod->ls!=nil)
nod->ls->r^=nod->r;
if(nod->ld!=nil)
nod->ld->r^=nod->r;
if(nod->r==1)
{
nod->r=0;
treap *f=nod->ls;
nod->ls=nod->ld;
nod->ld=f;
}
nod->nrc=1;
if(nod->ls!=nil)
nod->nrc+=nod->ls->nrc;
if(nod->ld!=nil)
nod->nrc+=nod->ld->nrc;
}
void rot1(treap *&nod)
{
treap *f=nod->ls;
nod->ls=f->ld;
f->ld=nod;
update(nod);
update(f);
nod=f;
}
void rot2(treap *&nod)
{
treap *f=nod->ld;
nod->ld=f->ls;
f->ls=nod;
update(nod);
update(f);
nod=f;
}
void balance(treap *&nod)
{
if(nod->ls->pr>nod->pr)
rot1(nod);
else
if(nod->ld->pr>nod->pr)
rot2(nod);
else
update(nod);
}
void ins(treap *&nod,int f,int g,int p)
{
if(nod==nil)
{
nod=new treap;
nod->nrc=1;
nod->ls=nod->ld=nil;
nod->val=f;
nod->pr=p;
return;
}
update(nod);
update(nod->ls);
update(nod->ld);
if(nod->ls->nrc>=g)
ins(nod->ls,f,g,p);
else
{
g-=nod->ls->nrc+1;
ins(nod->ld,f,g,p);
}
balance(nod);
}
void gaseste(treap *&nod,int f)
{
int g=1;
update(nod);
update(nod->ls);
update(nod->ld);
if(nod->ls!=nil)
g+=nod->ls->nrc;
// cout<<f<<' '<<g<<' '<<nod->nrc<<'\n';
if(g==f)
{
fout<<nod->val<<' ';
return;
}
if(nod->ls->nrc>=f)
gaseste(nod->ls,f);
else
gaseste(nod->ls,f-nod->ls->nrc-1);
}
void sterge(treap *&nod)
{
update(nod);
update(nod->ls);
update(nod->ld);
if(nod->ls==nil&&nod->ld==nil)
{
//cout<<nod->pr<<"x ";
delete nod;
nod=nil;
return;
}
if(nod->ls->pr>nod->ld->pr)
{
// cout<<'y';
// cout<<nod->ls->pr<<' ';
rot1(nod);
// cout<<nod->ls->val<<' ';
sterge(nod->ld);
}
else
{
rot2(nod);
// cout<<nod->ld->pr<<' ';
sterge(nod->ls);
}
update(nod);
}
void rev(int f,int g)
{
p=ma+2;
ins(t,0,f-1,p);
p=ma+1;
ins(t->ld,0,g+1,p);
t->ld->ls->r^=1;
// cout<<t->pr<<' ';
sterge(t);
// cout<<t->pr<<' ';
sterge(t);
}
void stergetot(treap *&nod)
{
if(nod==nil)
return;
stergetot(nod->ls);
stergetot(nod->ld);
delete nod,nod=nil;
}
void del(int f,int g)
{
p=ma+2;
ins(t,0,f-1,p);
p=ma+1;
ins(t,0,g+1,p);
stergetot(t->ld->ls);
sterge(t);
sterge(t);
}
void afis(treap *&nod)
{
update(nod->ls);
update(nod->ld);
update(nod);
if(nod==nil)
return;
afis(nod->ls);
// cout<<nod->r<<'\n';
fout<<nod->val<<' ';
afis(nod->ld);
}
int main()
{
t=nil=new treap;
srand(time(0));
t->ls=t->ld=nil->ls=nil->ld=nil;
fin>>q>>type;
while(q--)
{
fin>>ch;
if(ch=='I')
{
fin>>g>>f;
n++;
p=rand()+1;
ma=max(ma,p);
ins(t,f,g-1,p);
continue;
}
if(ch=='A')
{
fin>>f;
gaseste(t,f);
fout<<'\n';
continue;
}
if(ch=='R')
{
fin>>f>>g;
rev(f,g);
continue;
}
fin>>f>>g;
del(f,g);
n-=g-f+1;
}
afis(t);
}