Cod sursa(job #3320957)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 7 noiembrie 2025 18:57:10
Problema Secv8 Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.45 kb
#include <bits/stdc++.h>
using namespace std;
//#define TESTS
#define FIO

#define x first
#define y second
#define pii pair<int,int>
#define veci vector<int>
#define vecp vector<pii>
#define all(x) x.begin(), x.end()
#define pb(x,y) x.push_back(y)

struct TreapNode{
	int val=0, prio=0;
	int size=0;
	bool reversed=0;
	TreapNode *l=NULL, *r=NULL;
	TreapNode *get_l()
	{
		if(!l) l = new TreapNode;
		return l;
	}

	TreapNode *get_r()
	{
		if(!r) r = new TreapNode;
		return r;
	}

	~TreapNode()
	{
		delete l;
		delete r;
	}
};

int getsize(TreapNode *x)
{
	return x? (x->size) : 0;
}

void upsize(TreapNode *x)
{
	if(x) x->size = 1+getsize(x->l)+getsize(x->r);
}

void flip(TreapNode *x)
{
	if(!x) return;
	swap(x->l, x->r);
	flip(x->l);
	flip(x->r);
}

void push_rev(TreapNode *x)
{
	if(!x) return;
	if(!x->reversed) return;
	x->reversed = 0;
	swap(x->l, x->r);
	if(x->l) x->l->reversed = !(x->l->reversed);
	if(x->r) x->r->reversed = !(x->r->reversed);
}

TreapNode *join(TreapNode *l, TreapNode *r)
{
	if(l==NULL) return r;
	if(r==NULL) return l;

	push_rev(l);
	push_rev(r);

	if(l->prio > r->prio)
	{
		l->r = join(l->r, r);
		upsize(l);
		return l;
	}

	r->l = join(l, r->l);
	upsize(r);
	return r;
}

void separate(TreapNode *base, int index, TreapNode*& l, TreapNode *& r, int add=0)
{
	push_rev(base);
	if(base==NULL)
	{
		//cerr<<"HERE??\n";
		l=NULL;
		r=NULL;
		return;
	}

	if(getsize(base->l) + add < index)
	{
		l=base;
		
		separate(base->r, index, base->r, r, add+getsize(base->l)+1);

		upsize(l);
		return;
	}

	r=base;
	separate(base->l, index, l, base->l, add);
	upsize(r);
}


void printNode(TreapNode *x)
{
	if(!x) return;
	printNode(x->l);
	cout<<x->val<<' ';
	printNode(x->r);
}


struct Treap{
	TreapNode *root=NULL;

	void insert(int poz, int x)
	{
		TreapNode *next = new TreapNode;
		next->val =x;
		next->size = 1;
		next->prio=rand();
		TreapNode *l,*r;

		//cerr<<"here\n";
		separate(root, poz-1, l, r);

		l=join(l, next);
		//cerr<<"here\n";
		root=join(l,r);
	}
	
	void erase(int st, int dr)
	{
		TreapNode *l, *mid, *r;

		separate(root, dr, l, r);
		separate(l, st-1, l, mid);

		delete mid;

		root=join(l, r);
	}

	void reverse(int st, int dr)
	{
		TreapNode *l, *mid, *r;
		separate(root, dr, l, r);
		separate(l, st-1, l, mid);

		mid->reversed= !(mid->reversed);

		l=join(l, mid);
		root=join(l, r);
	}

	int get(int poz)
	{
		TreapNode *current=root;
		while(true)
		{
			push_rev(current);
			if(getsize(current->l)>=poz) current=current->l;
			else if(getsize(current->l)+1<poz) poz-=getsize(current->l)+1, current=current->r;
			else return current->val;
		}
	}

	void printTreap()
	{
		printNode(root);
		cout<<'\n';
	}

	~Treap()
	{
		delete root;
	}
};


const int maxn = 1e5+5;
int n,rev;

void solve()
{
	cin>>n>>rev;
	Treap tri;

	for(int i=1;i<=n;i++)
	{
		int x,y; char c;
		cin>>c;
		switch (c)
		{
		case 'I':
			cin>>x>>y;
			tri.insert(x,y);
			break;
		case 'R': 
			cin>>x>>y;
			tri.reverse(x,y);
			break;
		case 'A':
			cin>>x;
			cout<<tri.get(x)<<'\n';
			break;
		case 'D':
			cin>>x>>y;
			tri.erase(x,y);
			break;
		default:
			cerr<<"ai citit "<<c<<'\n';
			assert(0);
		}
		//cerr<<"HERE "<<i<<' '<<c<<' '<<x<<','<<y<<'\n';
		//tri.printTreap();
	}
	tri.printTreap();
}

int main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	#ifndef LOCAL
	#ifdef FIO
		#define fname "secv8"
		freopen(fname".in", "r", stdin);
		freopen(fname".out", "w", stdout);
	#endif
	#endif

	int t=1;

	#ifdef TESTS
		cin>>t;
	#endif
	while(t--)
	{
		solve();
	}
	return 0;
}