Pagini recente » Cod sursa (job #42746) | Cod sursa (job #1585114) | Cod sursa (job #1396968) | Cod sursa (job #188035) | Cod sursa (job #472557)
Cod sursa(job #472557)
#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 + min (left, right), v);
int i;
for (i = min (left, right); i < len; ++i)
if (v[i] != n->v[i])
break;
length = i - 1;
}
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;
}