Cod sursa(job #381472)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 10 ianuarie 2010 18:38:18
Problema Secv8 Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.54 kb
using namespace std;

#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <iomanip>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>

#define pb push_back
#define size(V) ((int)(V.size()))
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FORit(it, x) for (__typeof((x).begin()) it = (x).begin(); it != (x).end(); ++it)
#define REP(i, N) for (int i = 0; i < (int)(N); ++i)
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair
#define oo 1<<30

#define IN "secv8.in"
#define OUT "secv8.out"

typedef vector<int> VI;
typedef pair<int,int> pi;
typedef vector<string> VS;
template<class T> string toString(T n) {ostringstream ost;ost<<n;ost.flush();return ost.str();}
typedef vector<string> VS;

struct treap
{
    int key,pri,nr;
    bool rev;
	treap *left,*right;
	
	treap() {} treap(int key,int pri, int nr,bool rev,treap* left, treap* right)
	{
		this->key = key;
		this->pri = pri;
		this->nr = nr;
		this->rev = rev;
		this->left = left, this->right = right;
	}
};

treap *rez,*nil,*R = nil;

int N,K,Ifreverse;
char buffer[1<<23];

II void read(int &aux)
{
	aux = 0;
	for(;buffer[K] < '0' || buffer[K] > '9';++K);
	for(;buffer[K] >= '0' && buffer[K] <= '9';++K)
		aux = aux * 10 + buffer[K] - '0';
}

II void read(char &aux)
{
	for(;buffer[K] < 'A' || buffer[K] > 'Z';++K);
	aux = buffer[K++];
}

II void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	fread(buffer,1,1<<23,stdin);
	
	read(N);
	read(Ifreverse);
}

II void update(treap* &nod)
{
	nod->nr = nod->left->nr + nod->right->nr + 1;
}

II void rotate_left(treap* &nod)
{
	treap *aux = nod->left;
    nod->left = aux->right, aux->right = nod;
    nod = aux;
	
	update(nod->right);
	update(nod);
}

II void rotate_right(treap* &nod)
{
	treap *aux = nod->right;
    nod->right = aux->left, aux->left = nod;
    nod = aux;
	
	update(nod->left);
	update(nod);
}

II void insert(treap* &nod,int key,int x,int pri)
{
	if(nod == nil)
	{
		nod = new treap(x,pri,1,false,nil,nil);
		return;
	}
	
	++nod->nr;
	if(key <= nod->left->nr + 1)
		insert(nod->left,key,x,pri);
	else
		insert(nod->right,key - nod->left->nr - 1,x,pri);
	
	if(nod->left->pri > nod->pri)
		rotate_left(nod);
	else if(nod->right->pri > nod->pri)
		rotate_right(nod);
}

II void erase(treap* &nod,int key)
{
	if (nod == nil) 
		return;
	
	if(key <= nod->left->nr)
        erase(nod->left, key);
    else if (key > nod->left->nr + 1)
        erase(nod->right, key - nod->left->nr - 1);
    else
	{    
        if (nod->left == nil && nod->right == nil)
        {
			delete nod,nod = nil;
			return;
		}
        else 
		{
            bool ok = (nod->left->pri > nod->right->pri);
			if(ok)
			{
				rotate_left(nod);
				erase(nod->right,key - nod->left->nr - 1);
            }
			else
			{
				rotate_right(nod);
				erase(nod->left,key);
			}
        }
    }
	--nod->nr;
}

II void erase_int(treap* &R,int x,int y)
{
	treap *Tleft,*Taux,*Tright;
	
	insert(R,x,oo,oo);
	Tleft = R->left;
	Taux = R->right;
	delete R,R = nil;
	
	insert(Taux,y - x + 2,oo,oo);
	Tright = Taux->right;
	delete Taux,Taux = nil;
	
	R = new treap(-oo,-oo,Tleft->nr + Tright->nr + 1,false,Tleft,Tright);
	erase(R,Tleft->nr + 1);
}

II int query(treap* nod,int key)
{
	int mij = nod->left->nr + 1;
	if(mij == key)
		return nod->key;
	return (key < mij) ? query(nod->left,key) : query(nod->right,key - mij);
}

II void DF(treap* nod)
{
	if(nod==nil)
		return;
	
	DF(nod->left);
	printf("%d ",nod->key);
	DF(nod->right);
	
	if(nod == R)
		printf("\n");
}

II void solve()
{
	srand((int)time(0));
	char tip;
	int k,x,y;
	
	nil = new treap(0,-oo,0,false,nil,nil);
	R = nil;
	
	FOR(i,1,N)
	{
		read(tip);
		
		if(tip == 'I')
		{
			read(k);read(x);
			
			int pri = rand() % N + 1;
			insert(R,k,x,pri);
		}
		else if(tip == 'A')
		{
			read(k);
			printf("%d\n",query(R,k) );
		}
		else if(tip == 'R')
		{
			read(x);read(y);
		}
		else
		{
			read(x);read(y);
			erase_int(R,x,y);
		}
	}
	
	DF(R);
	
	//printf("Time %d ms\n",clock() );
}

int main()
{
	scan();
	solve();
	return 0;
}