Pagini recente » Cod sursa (job #1967247) | Cod sursa (job #728369) | Cod sursa (job #2248523) | Cod sursa (job #101903) | Cod sursa (job #1975803)
#include <bits/stdc++.h>
#define MOD 1000000009
using namespace std;
ofstream fout("secv8.out");
struct Node
{
Node *Left,*Right;
int pr,lazy,cnt,val;
Node(int x)
{
Left=Right=0;
pr=rand()%MOD;
lazy=0;
cnt=1;
val=x;
}
} *rad = 0;
int cnt(Node *node)
{
if(!node) return 0;
return node->cnt;
}
void upd(Node *node)
{
if(!node) return;
node->cnt=cnt(node->Left)+cnt(node->Right)+1;
}
void propag(Node *node)
{
if(!node || !node->lazy) return;
swap(node->Left,node->Right);
if(node->Left)
node->Left->lazy^=1;
if(node->Right)
node->Right->lazy^=1;
node->lazy=0;
}
Node *Merge(Node *L, Node *R)
{
if(!L) return R;
if(!R) return L;
propag(L); upd(L);
propag(R); upd(R);
if(L->pr > R->pr)
{
L->Right=Merge(L->Right,R);
upd(L);
return L;
}
R->Left=Merge(L,R->Left);
upd(R);
return R;
}
pair <Node*,Node*> Split(Node *node, int k)
{
if(!node) return make_pair((Node*)0,(Node*)0);
propag(node); upd(node);
if(cnt(node->Left)>=k)
{
pair <Node*,Node*> w=Split(node->Left,k);
node->Left=w.second;
upd(node);
return make_pair(w.first,node);
}
pair <Node*,Node*> w=Split(node->Right,k-cnt(node->Left)-1);
node->Right=w.first;
upd(node);
return make_pair(node,w.second);
}
void Solve(Node *nod)
{
if(!nod) return;
propag(nod); upd(nod);
Solve(nod->Left);
fout<<nod->val<<" ";
Solve(nod->Right);
}
int main()
{
int T,x,y;
char tip;
ifstream cin("secv8.in");
srand(time(0));
cin>>T>>x;
while(T--)
{
cin>>tip>>x;
if(tip=='A')
{
pair<Node*,Node*> w=Split(rad,x);
pair<Node*,Node*> w1=Split(w.first,x-1);
fout<<w1.second->val<<"\n";
rad=Merge(Merge(w1.first,w1.second),w.second);
}
else
{
cin>>y;
if(tip=='I')
{
--x;
pair<Node*,Node*> w=Split(rad,x);
rad=Merge(Merge(w.first,new Node(y)),w.second);
}
else
if(tip=='R')
{
pair<Node*,Node*> w=Split(rad,x-1);
pair<Node*,Node*> w1=Split(w.second,y-x+1);
w1.first->lazy^=1;
rad=Merge(Merge(w.first,w1.first),w1.second);
}
else
{
pair<Node*,Node*> w=Split(rad,x-1);
pair<Node*,Node*> w1=Split(w.second,y-x+1);
rad=Merge(w.first,w1.second);
}
}
}
Solve(rad);
return 0;
}