Pagini recente » Cod sursa (job #2159360) | Cod sursa (job #2409875) | Cod sursa (job #736850) | Cod sursa (job #2523522) | Cod sursa (job #420371)
Cod sursa(job #420371)
#include <cstdio>
#include <algorithm>
using namespace std;
#define Lmax 100010
struct Trie {
int nr, viz;
Trie *fiu[10];
Trie () {
nr = viz = 0;
memset (fiu, 0, sizeof (fiu));
}
} *R[Lmax];
int T, tip, k, len, i;
int AI[Lmax * 4], poz;
char nr[Lmax];
#define MIJ ((st + dr) >> 1)
#define N1 (nod << 1)
#define N2 ((nod << 1) + 1)
void add_trie (Trie *R, char *nr) {
if (*nr == '\n') {
R->nr++;
R->viz = 1;
return ;
}
if (!R->fiu[ *nr - '0' ])
R->fiu[*nr - '0'] = new Trie;
add_trie (R->fiu[*nr - '0'], nr + 1);
R->nr = 0;
for (i = 0; i <= 9; i++)
if (R->fiu[i]) R->nr+= R->fiu[i]->nr;
}
int cauta_trie (Trie *R, char *nr) {
if (*nr == '\n') {
return R->viz;
}
if (!R->fiu[ *nr - '0' ])
return 0;
return cauta_trie (R->fiu[*nr - '0'], nr + 1);
}
void query_trie (Trie *R, int p) {
if (p > len) return ;
for (i = 0; i <= 9; i++)
if (R->fiu[i]) {
if (k <= R->fiu[i]->nr) {
printf ("%c", i + '0');
query_trie (R->fiu[i], p + 1);
break;
}
else
k-= R->fiu[i]->nr;
}
}
void update (int nod, int st, int dr) {
if (st == dr) {
AI[nod]++;
return ;
}
if (poz <= MIJ) update (N1, st, MIJ);
else update (N2, MIJ + 1, dr);
AI[nod] = AI[N1] + AI[N2];
}
void query (int nod, int st, int dr) {
if (st == dr) {
len = st;
return ;
}
if (k <= AI[N1])
query (N1, st, MIJ);
else {
k-= AI[N1];
query (N2, MIJ + 1, dr);
}
}
int main () {
freopen ("nums.in", "r" ,stdin);
freopen ("nums.out", "w" ,stdout);
int i;
for (i = 1; i <= Lmax; i++)
R[i] = new Trie;
scanf ("%d", &T);
for (; T; T--) {
scanf ("%d ", &tip);
if (tip == 1) {
scanf ("%s", nr);
poz = strlen (nr); nr[poz] = '\n';
if (!cauta_trie (R[poz], nr)) {
update (1, 1, Lmax);
add_trie (R[poz], nr);
}
}
else {
scanf ("%d", &k);
query (1, 1, Lmax);
query_trie (R[len], 1);
printf ("\n");
}
}
return 0;
}