Cod sursa(job #472561)

Utilizator blasterzMircea Dima blasterz Data 25 iulie 2010 16:50:23
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <cstdio>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <algorithm>
#define oo 0x3f3f3f3f

using namespace std;

struct nod
{
	char *v;
	int len;
	int p;
	int nr;
	nod *left, *right;
};

typedef nod* tree;

tree R, nil;

void init ()
{
	nil = new nod;
	nil->left = nil->right = 0;
	nil->v = 0;
	nil->p = -oo;
	nil->nr = 0;

	R = nil;
}

inline void getnr (tree &n)
{
	if (n == nil) return;
	n->nr = 1 + n->left->nr + n->right->nr;
}

inline void rotleft (tree &n)
{
	tree t = n->left;
	n->left = t->right;
	t->right = n;
	getnr (n); getnr (t);
	n = t;
}

inline void rotright (tree &n)
{
	tree t = n->right;
	n->right = t->left;
	t->left = n;
	getnr (n); getnr (t);
	n = t;
}

int left, right;
int length;

inline void insert (tree &n, char *v, int len)
{
	if (n == nil)
	{
		n = new nod;
		n->left = n->right = nil;
		n->p = rand ();
		n->nr = 1;
		n->len = len;
		n->v = new char[len + 1];
		strcpy (n->v, v);
		return;
	}

	int cmp = 0;
	if (n->len < len) cmp = -1;
	else
		if (n->len > len) cmp = 1;
		else
		{
			cmp = strcmp (n->v, v);
	/*	
			int i;
			for (i = min (left, right) + 1; i < len; ++i)
				if (v[i] == n->v[i])
					length = i;
				else if (v[i] < n->v[i])
				{
					cmp = 1;
					break;
				}
				else
				{
					cmp = -1;
					break;
				}
			*/
		}
	if (cmp > 0)
	{
		right = length;
		insert (n->left, v, len);
		if (n->left->p > n->p)
			rotleft (n);
	}	
	if (cmp < 0)
	{
		left = length;
		insert (n->right, v, len);
		if (n->right->p > n->p)
			rotright (n);
	}
	
	getnr (n);
	
}

char * findk (tree &n, int k)
{
	if (n == nil) return NULL;
	if (n->left->nr + 1 == k) return n->v;
	if (n->left->nr + 1 > k) return findk (n->left, k);
	if (n->left->nr + 1 < k) return findk (n->right, k - (n->left->nr + 1));
	return NULL;
}

void ino (tree n)
{
	if (n == nil) return;
	ino (n->left);
	printf ("(%s) ", n->v);
	ino (n->right);
}

char ax[100003];

int main ()
{
	freopen ("nums.in", "r", stdin);
	freopen ("nums.out", "w", stdout);
	
	srand (time (0));
	init ();
	
	int n;
	
	scanf ("%d\n", &n);
	
	int t;
	int len;
	int k;
	
	while (n--)
	{
		scanf ("%d ", &t);
		
		if (t == 1)
		{
			scanf ("%s\n", &ax);
			len = strlen (ax);
				
			left = right = -1;
			insert (R, ax, len);
			
			memset (ax, 0, sizeof (char) * (len + 1));
		}
		else
		{
			scanf ("%d\n", &k);
		//	printf ("__%d\n", k);
			printf ("%s\n", findk (R, k));
			
		}
		
		
	}
	
	//printf ("%d\n", R->nr);
	

	//ino (R);
	return 0;
}