Pagini recente » Cod sursa (job #3286336) | Cod sursa (job #2044054) | Cod sursa (job #1491982) | Cod sursa (job #238169) | Cod sursa (job #420375)
Cod sursa(job #420375)
#include <cstdio>
#include <algorithm>
using namespace std;
#define Lmax 100001
struct Trie {
int nr;
bool viz;
Trie *fiu[10];
Trie () {
nr = viz = 0;
memset (fiu, 0, sizeof (fiu));
}
} *R[Lmax];
int T, tip, k, len, i, p;
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) {
if (nr[p] == '\n') {
R->nr++;
R->viz = 1;
return ;
}
if (!R->fiu[ nr[p] - '0' ])
R->fiu[nr[p] - '0'] = new Trie;
p++;
add_trie (R->fiu[nr[p - 1] - '0']);
p--;
R->nr = 0;
for (i = 0; i <= 9; i++)
if (R->fiu[i]) R->nr+= R->fiu[i]->nr;
}
int cauta_trie (Trie *R) {
if (nr[p] == '\n') {
return R->viz;
}
if (!R->fiu[ nr[p] - '0' ])
return 0;
p++;
return cauta_trie (R->fiu[nr[p - 1] - '0']);
}
void query_trie (Trie *R) {
if (p > len) return ;
for (i = 0; i <= 9; i++)
if (R->fiu[i]) {
if (k <= R->fiu[i]->nr) {
printf ("%c", i + '0');
p++;
query_trie (R->fiu[i]);
p--;
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';
p = 0;
if (!cauta_trie (R[poz])) {
update (1, 1, Lmax);
p = 0;
add_trie (R[poz]);
}
}
else {
scanf ("%d", &k);
query (1, 1, Lmax);
p = 0;
query_trie (R[len]);
printf ("\n");
}
}
return 0;
}