Cod sursa(job #2711926)

Utilizator BogdanTicuTicu Bogdan Valeriu BogdanTicu Data 24 februarie 2021 21:30:36
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.64 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream in("secv8.in");
ofstream out("secv8.out");
 
const int MOD = 1000*1000*1000 + 7;
 
struct node
{
    int cnt, val, priority;
    bool ok;
    node *left, *right;
 
    node(int val, int priority) {
        this -> ok = false;
        this -> cnt = 1;
        this -> val = val;
        this -> priority = priority;
        this -> left= NULL;
        this -> right= NULL;
    }
};
 
node * rad;
 
void lazyup(node *&n) 
{
    if(n && n->ok) 
	{
        swap(n->left,n->right);
        n->ok = 0;
 
        if(n -> left)
            n -> left -> ok ^= 1;
 
        if(n -> right)
            n -> right -> ok ^= 1;
    }
}
 
void afisare(node *n) {
    	if(n == NULL) return;
 
	lazyup(n);
 
    	afisare(n -> left);
    	out << n -> val << " ";
	afisare(n -> right);
}
 
int getCnt(node *& n) 
{
	if(n == NULL)
		return 0;
	return n -> cnt;
}
 
void update(node *& n) 
{
	if(n== NULL)
        	return;
 
    	n -> cnt = 1 + getCnt(n -> left) + getCnt(n -> right);
}
 
void split(node * n, node *& tree1, node *& tree2, int key, int add) 
{
   	if(n == NULL) 
	{
        	tree1 = tree2 = NULL;
        	return;
    	}
 
    	lazyup(n);
    	int aux = add + getCnt(n -> left) + 1;
 
    	if(aux <= key) 
	{
        	tree1 = n;
        	split(n -> right, tree1 -> right, tree2, key, aux);
    	}
    	else 
	{
        	tree2 = n;
       		split(n -> left, tree1, tree2 -> left, key, add);
    	}
    	update(n);
}
 
void join(node *& n, node * tree1, node * tree2) 
{
    	lazyup(tree1);
    	lazyup(tree2);
 
    	if(tree1 == NULL || tree2 == NULL) 
        	n = (tree1 == NULL) ? tree2 : tree1;
    	else if(tree1 -> priority > tree2 -> priority) 
	{
        	n = tree1;
        	join(n -> right, tree1 -> right, tree2);
    	}
    	else 
	{
        	n = tree2;
        	join(n -> left, tree1, tree2 -> left);
    	}
 
    	update(n);
}
 
void insert(node *& n, node * newNode, int pos) 
{
    	node * tree1, * tree2;
 
    	split(n, tree1, tree2, pos - 1, 0);
    	join(tree1, tree1, newNode);
    	join(n, tree1, tree2);
}


void erase(node *& n, int x, int y) 
{
    	node * tree1 = NULL, * tree2 = NULL, * tree3 = NULL;
 
    	split(n, tree1, tree3, y, 0);
    	split(tree1, tree1, tree2, x - 1, 0);
 
    	join(n, tree1, tree3);
}
 

void reverse(node*& n, int x, int y) 
{
    	node * tree1 = NULL, * tree2 = NULL, * tree3 = NULL;
 
    	split(n, tree1, tree3, y, 0);
    	split(tree1, tree1, tree2, x - 1, 0);
 
    	tree2 -> ok ^= 1;
 
    	join(n, tree1, tree2);
    	join(n, n, tree3);
}
 

int access(node *n, int pos) 
{
    	node * tree1 = NULL, * tree2 = NULL, * tree3 = NULL;
 
    	split(n, tree1, tree3, pos, 0);
    	split(tree1, tree1, tree2, pos - 1, 0);
 
    	int ans = tree2 -> val;
    	join(n, tree1, tree2);
    	join(n, n, tree3);
 
    	return ans;
}
 
int randomtime() 
{
    	return 1LL * rand() * rand() % MOD;
}
 
int main()
{
    	srand(time(NULL));
 
    	int x, y, t;
    	char type;
    	in >> t >> x;
 
    	while(t--) 
	{
        	in >> type >> x;
 
        	if(type == 'I') 
		{
            		in >> y;
            		node * newNode = new node(y, randomtime());
            		insert(rad, newNode, x);
        	}
 
        	if(type == 'A')
            		out << access(rad, x) << '\n';
 
        	if(type == 'R') 
		{
            		in >> y;
            		reverse(rad, x, y);
        	}
 	
        	if(type == 'D') 
		{
            		in >> y;
            		erase(rad, x, y);
        	}
    	}
    	afisare(rad);
 
    	return 0;
}