Pagini recente » Cod sursa (job #1773979) | Cod sursa (job #2880746) | Cod sursa (job #129819) | Cod sursa (job #1549064) | Cod sursa (job #320466)
Cod sursa(job #320466)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
const int maxn = 100002;
const int maxarb = 1 << 18;
ifstream in("nums.in");
ofstream out("nums.out");
struct trie
{
short nr;
trie *next[10];
trie()
{
nr = 0;
memset(next, 0, sizeof(next));
}
};
struct info
{
short nr;
trie *T;
};
int n;
info a[maxarb];
char buf[maxn];
void insert(trie *&node, const char num[], bool &ok)
{
if ( *num == '\0' )
{
if ( !node->nr )
node->nr = 1;
return;
}
int val = *num - '0';
if ( !node->next[val] )
{
node->next[val] = new trie;
ok = 1;
}
insert(node->next[val], num + 1, ok);
node->nr += ok;
}
void update(int nod, int st, int dr, int len)
{
if ( len < st || len > dr )
return;
if ( st == dr )
{
bool t = 0;
if ( !a[nod].T )
a[nod].T = new trie;
insert(a[nod].T, buf, t);
a[nod].nr = a[nod].T->nr;
return;
}
int q = nod << 1;
int m = (st + dr) >> 1;
update(q, st, m, len);
update(q+1, m+1, dr, len);
a[nod].nr = a[q].nr + a[q+1].nr;
}
void print_kth(trie *&node, int poz, char cif)
{
if ( !node )
return;
if ( cif != '-' )
out << cif;
int start = 0;
for ( int i = 0; i < 10; ++i )
if ( node->next[i] )
{
if ( node->next[i]->nr < poz )
poz -= node->next[i]->nr;
else
{
start = i;
break;
}
}
print_kth(node->next[start], poz, start + '0');
}
void query(int nod, int st, int dr, int poz)
{
if ( st == dr )
{
print_kth(a[nod].T, poz, '-');
return;
}
int q = nod << 1;
int m = (st + dr) >> 1;
if ( a[q].nr < poz ) query(q+1, m+1, dr, poz - a[q].nr);
else query(q, st, m, poz);
}
int main()
{
in >> n;
int op, k, t;
int maxlen = -1;
for ( int i = 1; i <= n; ++i )
{
in >> op;
if ( op == 1 )
{
in >> buf;
t = strlen(buf);
if ( t > maxlen )
maxlen = t;
update(1, 1, maxn, t);
}
else
{
in >> k;
query(1, 1, maxn, k);
out << '\n';
}
}
return 0;
}