Pagini recente » Cod sursa (job #1624765) | Cod sursa (job #2984809)
#include <bits/stdc++.h>
using namespace std;
ifstream in("secv8.in");
ofstream out("secv8.out");
struct Treap{
int sz, val, prio;
bool rev_lazy;
Treap *st, *dr;
Treap(int sz = 0, int val = 0, int prio = 0){
this->sz = sz;
this->val = val;
this->prio = prio;
this->rev_lazy = 0;
st = dr = NULL;
}
};
void push(Treap *nod)
{
if(nod == NULL || nod->rev_lazy == 0)
return;
swap(nod->st, nod->dr);
nod->rev_lazy = 0;
if(nod->st != NULL)
nod->st->rev_lazy ^= 1;
if(nod->dr != NULL)
nod->dr->rev_lazy ^= 1;
}
int marime(Treap *nod)
{
if(nod == NULL)
return 0;
return nod->sz;
}
Treap* merge(Treap *t1, Treap *t2)
{
push(t1);
push(t2);
if(t1 == NULL)
return t2;
if(t2 == NULL)
return t1;
if(t1->prio > t2->prio)
{
t1->dr = merge(t1->dr, t2);
t1->sz = marime(t1->st) + 1 + marime(t1->dr);
return t1;
}
else
{
t2->st = merge(t1, t2->st);
t2->sz = marime(t2->st) + 1 + marime(t2->dr);
return t2;
}
}
pair <Treap*, Treap*> split(Treap *nod, int cate)
{
push(nod);
if(nod == NULL)
return {NULL, NULL};
if(cate == marime(nod))
return {nod, NULL};
if(cate == 0)
return {NULL, nod};
if(cate <= marime(nod->st))
{
pair <Treap*, Treap*> aux = split(nod->st, cate);
nod->st = aux.second;
nod->sz = marime(nod->st) + 1 + marime(nod->dr);
return {aux.first, nod};
}
else
{
pair <Treap*, Treap*> aux = split(nod->dr, cate - marime(nod->st) - 1);
nod->dr = aux.first;
nod->sz = marime(nod->st) + 1 + marime(nod->dr);
return {nod, aux.second};
}
}
Treap *rad = NULL;
void afis(Treap* nod)
{
push(nod);
if(nod == NULL)
return;
afis(nod->st);
out << nod->val << " ";
afis(nod->dr);
}
int main()
{
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int t, x, y;
char c;
in >> t >> x;
while(t--)
{
in >> c;
if(c == 'I')
{
in >> x >> y;
pair <Treap*, Treap*> rez = split(rad, x - 1);
rad = merge(merge(rez.first, new Treap(1, y, rng() % INT_MAX)), rez.second);
}
else if(c == 'A')
{
in >> x;
pair <Treap*, Treap*> rez = split(rad, x);
pair <Treap*, Treap*> rez2 = split(rez.first, x - 1);
out << rez2.second->val << '\n';
rad = merge(merge(rez2.first, rez2.second), rez.second);
}
else if(c == 'R')
{
in >> x >> y;
pair <Treap*, Treap*> rez = split(rad, y);
pair <Treap*, Treap*> rez2 = split(rez.first, x - 1);
rez2.second->rev_lazy ^= 1;
rad = merge(merge(rez2.first, rez2.second), rez.second);
}
else if(c == 'D')
{
in >> x >> y;
pair <Treap*, Treap*> rez = split(rad, y);
pair <Treap*, Treap*> rez2 = split(rez.first, x - 1);
rad = merge(rez2.first, rez.second);
}
}
afis(rad);
return 0;
}