Cod sursa(job #472598)

Utilizator blasterzMircea Dima blasterz Data 25 iulie 2010 20:25:34
Problema Nums Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.12 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;
		//	fprintf (stderr, "%s v: %s ->%d %d \n", n->v, v, left, right);
			for (i = min (left, right) ; i < len; ++i)
			{
				if (v[i] == n->v[i])
					length = i + 1;
				if (v[i] < n->v[i])
				{
					cmp = 1;
					break;
				}
				if (v[i] > n->v[i])
				{
					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 findk (n->left, k);
	if (n->left->nr + 1 < k) return findk (n->right, k - (n->left->nr + 1));
	return n->v;
}

void ino (tree n)
{
	if (n == nil) return;
	ino (n->left);
	fprintf (stderr, "(%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;
	/*
	sprintf (ax, "1111112");
	insert (R, ax, strlen (ax));
	
	sprintf (ax, "1111113");
	insert (R, ax, strlen (ax));
	
	sprintf (ax, "1111116");
	insert (R, ax, strlen (ax));
	
	sprintf (ax, "1111119");
	insert (R, ax, strlen (ax));
	
	sprintf (ax, "1111114");
	insert (R, ax, strlen (ax));
	
	sprintf (ax, "1111118");
	insert (R, ax, strlen (ax));
	
	fprintf (stderr,"\n\n\n");
	ino (R);
	fprintf (stderr,"\n\n\n");
	
	memset (ax, 0, sizeof (ax));
	
	*/
	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 = length = 0;
			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;
}