Cod sursa(job #1072175)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 4 ianuarie 2014 03:47:24
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <cstdio>
#include <cstring>
#include <string>
#include <ctime>
#include <cstdlib>
using namespace std;

struct item
{
	string key;
	int priority, no;
	item *left, *right;
	item() { no = 0; };
	item(string key, int priority, item *left, item *right) 
	{
		this -> key = key;
		this -> priority = priority;
		this -> left = left;
		this -> right = right;
		recompute();
	}
	item(string key, int priority, item *left, item *right, int no) : no(no) { item(key, priority, left, right); };
	void recompute() { no = (left ? left -> no : 0) + (right ? right -> no : 0) + 1; }
};
typedef item * pitem;

pitem R, nil;

void init()
{
	srand(time(0));
	R = nil = new item("", 0, NULL, NULL, 0);
}

#define NMAX 100005
int n;
char line[NMAX];

inline bool comp_string(string s1, string s2)
{
	if (s1.size() != s2.size())
		return s1.size() < s2.size();
	
	return s1 < s2;
}

void rotleft(pitem &n)
{
	pitem t = n -> left;
	n -> left = t -> right;
	t -> right = n;
	n -> recompute();
	t -> recompute();
	n = t;
}

void rotright(pitem &n)
{
	pitem t = n -> right;
	n -> right = t -> left;
	t -> left = n;
	n -> recompute();
	t -> recompute();
	n = t;
}

void balance(pitem &n)
{
	if (n -> left -> priority > n -> priority)
		rotleft(n);
	else
		if (n -> right -> priority > n -> priority)
			rotright(n);
	
	n -> recompute();
}

string keyString;

void insert(pitem &n)
{
	if (n == nil)
	{
		n = new item(keyString, rand() + 1, nil, nil);
		return ;	
	}
	
	if (comp_string(keyString, n -> key))
		insert(n -> left);
	else
		if (comp_string(n -> key, keyString))
			insert(n -> right);
			
	balance(n);
}

string getNth(pitem &n, int &no)
{
	if (n -> left -> no >= no)
		return getNth(n -> left, no);
	else
	{
		no -= n -> left -> no;
		if (no == 1)
			return n -> key;
		return getNth(n -> right, --no);
	}
}

int main()
{
	//~ freopen("input", "r", stdin);
	freopen("nums.in", "r", stdin);
	freopen("nums.out", "w", stdout);
	init();
	scanf("%d", &n);
	int type;
	while (n--)
	{
		scanf("%d", &type);
		if (type)
		{
			scanf("%s", line);
			keyString = line;
			insert(R);
		}
		else
		{
			int no;
			scanf("%d", &no);
			printf("%s\n", getNth(R, no).c_str());
		}
	}
	return 0;
}