Cod sursa(job #3311434)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 22 septembrie 2025 11:45:53
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.95 kb
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
constexpr int NMAX=100'005;
constexpr ll MOD=1'000'000'007;

std::mt19937 rng(129723);
std::uniform_int_distribution<int> dist(-(1LL<<30), 1LL<<30);

struct Treap
{
	struct Node
	{
		int x, y;
		int sz=1;
		bool reversed=0;
		Node* l=0, *r=0;

		Node(int x=0) : x(x), y(dist(rng)) {}
		~Node()
		{
			delete l;
			delete r;
		}

		void propLz()
		{
			if(reversed)
			{
				reversed=0;
				std::swap(l, r);
				if(l)
					l->reversed=!l->reversed;
				if(r)
					r->reversed=!r->reversed;
			}
		}

		void pull()
		{
			sz=1;
			if(l)
				sz+=l->sz;
			if(r)
				sz+=r->sz;
		}
	};

	Node* root=0;

	~Treap()
	{
		delete root;
	}

	std::pair<Node*, Node*> split(Node* root, int pos)
	{
		if(root==0)
			return {0, 0};
		root->propLz();

		int szl=root->l ? root->l->sz : 0;

		if(pos<=szl)
		{
			auto p=split(root->l, pos);
			root->l=p.second;
			p.second=root;
			root->pull();
			return p;
		}

		auto p=split(root->r, pos-szl-1);
		root->r=p.first;
		p.first=root;
		root->pull();
		return p;
	}

	Node* merge(Node* l, Node* r)
	{
		if(l==0)
			return r;
		if(r==0)
			return l;

		l->propLz();
		r->propLz();

		if(l->y<r->y)
		{
			l->r=merge(l->r, r);
			l->r->pull();
			l->pull();
			return l;
		}

		r->l=merge(l, r->l);
		r->l->pull();
		r->pull();
		return r;
	}

	int get(Node* root, int pos)
	{
		if(root==0)
			return 0;
		root->propLz();
		int szl=root->l ? root->l->sz : 0;
		if(pos<szl)
			return get(root->l, pos);
		if(pos==szl)
			return root->x;
		return get(root->r, pos-1-szl);
	}

	int get(int pos)
	{
		return get(root, pos);
	}

	void insert(int x, int pos)
	{
		Node* n=new Node(x);
		auto p=split(root, pos);
		root=merge(p.first, merge(n, p.second));
	}

	void reverse(int l, int r)
	{
		auto d=split(root, r);
		auto s=split(d.first, l);
		s.second->reversed=!s.second->reversed;
		root=merge(merge(s.first, s.second), d.second);
	}

	void del(int l, int r)
	{
		auto d=split(root, r);
		auto s=split(d.first, l);
		root=merge(s.first, d.second);
		delete s.second;
	}

	void print(FILE* g)
	{
		print(g, root);
		fprintf(g, "\n");
	}
	void print(FILE* g, Node* root)
	{
		if(root==0)
			return;
		root->propLz();
		print(g, root->l);
		fprintf(g, "%d ", root->x);
		print(g, root->r);
	}
};

int main()
{
	FILE* f=fopen("secv8.in", "r"), *g=fopen("secv8.out", "w");
	char buf[128];
	int _, i, j, x;
	Treap T;

	fgets(buf, 128, f);
	sscanf(buf, "%d", &_);
	do
	{
		fgets(buf, 128, f);
		if(buf[0]=='I')
		{
			sscanf(buf+2, "%d%d", &i, &x);
			T.insert(x, i-1);
		}
		else if(buf[0]=='A')
		{
			sscanf(buf+2, "%d", &i);
			fprintf(g, "%d\n", T.get(i-1));
		}
		else if(buf[0]=='R')
		{
			sscanf(buf+2, "%d%d", &i, &j);
			T.reverse(i-1, j);
		}
		else
		{
			sscanf(buf+2, "%d%d", &i, &j);
			T.del(i-1, j);
		}
	}while(--_);

	T.print(g);

	fclose(f);
	fclose(g);
	return 0;
}