Cod sursa(job #940898)

Utilizator radustn92Radu Stancu radustn92 Data 17 aprilie 2013 12:59:11
Problema Nums Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;

struct entry
{
	string nr;
	entry *left, *right;
	int total;
	
	entry()
	{
		left = right = NULL;
		total = 0;
	}
};
entry *root = new entry();
int n, k;
string curr;

inline int comp(string s1, string s2)
{
	if (s1.size() < s2.size())
		return 1;
	if (s1.size() > s2.size())
		return -1;
	int i;
	for (i = 0; i < s1.size(); i++)
	{
		if (s1[i] < s2[i])
			return 1;
		if (s1[i] > s2[i])
			return -1;
	}
	return 0;
}

void add(entry *node)
{
	if (node -> total == 0)
	{
		node -> nr = curr;
		node -> total = 1;
		return ;
	}
	
	if (comp(node -> nr, curr) == 0)
		return ;
	
	if (comp(node -> nr, curr) == -1)
	{
		if (node -> left == NULL)
			node -> left = new entry();
		add(node -> left);
	}
	else
	{
		if (node -> right == NULL)
			node -> right = new entry();
		add(node -> right);
	}
	
	int sons = 1;
	if (node -> left != NULL)
		sons += node -> left -> total;
	if (node -> right != NULL)
		sons += node -> right -> total;
	node -> total = sons;
}

string search(entry *node)
{
	if (node -> left != NULL)
	{
		if (node -> left -> total >= k)
			return search(node -> left);
		k -= node -> left -> total;
	}
	
	if (k == 1)
		return node -> nr;
	k--;
	
	return search(node -> right);
}

int main()
{
	freopen("nums.in", "r", stdin);
	freopen("nums.out", "w", stdout);
	cin >> n;
	int i, tip;
	for (i = 1; i <= n; i++)
	{
		cin >> tip;
		if (tip == 1)
		{
			cin >> curr;
			add(root);
		}
		else
		{
			cin >> k;
			cout << search(root) << '\n';
		}
	}
	return 0;
}