Pagini recente » Borderou de evaluare (job #3337944) | Borderou de evaluare (job #3307525) | Borderou de evaluare (job #1637759) | Borderou de evaluare (job #3350031) | Cod sursa (job #3344955)
#include<bits/stdc++.h>
#define nl '\n'
using namespace std;
const string file="secv8";
ifstream f(file+".in");
ofstream g(file+".out");
//#define f cin
//#define g cout
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
struct node {
node *l,*r;
int val,prior,sz;
bool rev;
node(int x) {
l=r=NULL;
val=x;
sz=1;
prior=rnd();
rev=false;
}
};
struct treap {
node *root;
treap() {
root=NULL;
}
int getsz(node *nod) {
return nod?nod->sz:0;
}
void upd(node *nod) {
if (!nod) return;
nod->sz=1+getsz(nod->l)+getsz(nod->r);
}
void push(node *nod) {
if (!nod || !nod->rev) return;
swap(nod->l,nod->r);
if (nod->l) nod->l->rev^=1;
if (nod->r) nod->r->rev^=1;
nod->rev=false;
}
pair<node*,node*>split(node *nod, int k) {
if (nod==NULL) return {NULL,NULL};
push(nod);
if (getsz(nod->l)>=k) {
pair<node*,node*>p=split(nod->l,k);
nod->l=p.second;
upd(nod);
return {p.first,nod};
}
pair<node*,node*>p=split(nod->r,k-getsz(nod->l)-1);
nod->r=p.first;
upd(nod);
return {nod,p.second};
}
node* merge(node *a, node *b) {
if (!a || !b) return a?a:b;
if (a->prior>b->prior) {
push(a);
a->r=merge(a->r,b);
upd(a);
return a;
}
push(b);
b->l=merge(a,b->l);
upd(b);
return b;
}
void insert(int poz, int x) {
auto p=split(root,poz-1);
root=merge(merge(p.first,new node(x)),p.second);
}
int kth(node *nod,int poz) {
while (nod) {
push(nod);
int st=getsz(nod->l);
if (poz<st) nod=nod->l;
else if (poz==st) return nod->val;
else {
poz-=st+1;
nod=nod->r;
}
}
return -1;
}
void erase(int poz) {
auto p=split(root,poz);
auto q=split(p.second,1);
root=merge(p.first,q.second);
}
void erase(int st, int dr) {
auto p=split(root,st-1);
auto q=split(p.second,dr-st+1);
root=merge(p.first,q.second);
}
void reverse(int st, int dr) {
auto p=split(root,st-1);
auto q=split(p.second,dr-st+1);
if (q.first) q.first->rev^=1;
root=merge(p.first,merge(q.first,q.second));
}
void inorder(node *nod) {
if (!nod) return;
push(nod);
inorder(nod->l);
g<<nod->val<<" ";
inorder(nod->r);
}
}t;
int q,n;
int main(){
f>>q>>n;
while (q--) {
char op;
f>>op;
if (op=='I') {
int poz,val;
f>>poz>>val;
t.insert(poz,val);
}
else if (op=='A') {
int poz;
f>>poz;
g<<t.kth(t.root,poz-1)<<nl;
}
else if (op=='R') {
int st,dr;
f>>st>>dr;
t.reverse(st,dr);
}
else {
int st,dr;
f>>st>>dr;
t.erase(st,dr);
}
}
t.inorder(t.root);
system("pause");
return 0;
}