Pagini recente » Cod sursa (job #980790) | Cod sursa (job #781422) | Cod sursa (job #1095399) | Cod sursa (job #2627953) | Cod sursa (job #2209584)
#include <bits/stdc++.h>
using namespace std;
struct trie{
int guys;
trie *f[10];
trie(){
memset(f, 0, sizeof(f));
guys = 0;
}
};
int test, qr, aint[400005];
trie *rad[100005];
void update(int nod, int st, int dr, int pos)
{
if(st == dr)
++aint[nod];
else{
int m = (st+dr)/2;
if(pos <= m)
update(nod*2, st, m, pos);
else update(nod*2+1, m+1, dr, pos);
aint[nod] = aint[nod*2] + aint[nod*2+1];
}
}
int query(int nod, int st, int dr, int x)
{
if(st == dr)
return st;
int m = (st+dr)/2;
if(aint[nod*2] >= x)
return query(nod*2, st, m, x);
qr -= aint[nod*2];
return query(nod*2+1, m+1, dr, x-aint[nod*2]);
}
int main()
{
ifstream fin ("nums.in");
ofstream fout ("nums.out");
for (int i = 1; i <= 100000; ++i)
rad[i] = new trie;
fin >> test;
while(test--){
int t;
string s;
fin >> t;
if(t == 1){
fin >> s;
trie *t = rad[s.length()];
bool good = false;
for (int i = 0; i < s.length(); ++i){
int q = s[i]-'0';
if(t->f[q] == NULL){
good = true;
break;
}
t = t->f[q];
}
if(!good)
continue;
update(1, 1, 100000, s.length());
t = rad[s.length()];
for (int i = 0; i < s.length(); ++i){
int q = s[i]-'0';
++t->guys;
if(t->f[q] == NULL)
t->f[q] = new trie;
t = t->f[q];
}
++t->guys;
}else{
fin >> qr;
int dig = query(1, 1, 100000, qr);
trie *t = rad[dig];
for (int i = 1; i <= dig; ++i){
for (int j = 0; j < 10; ++j){
if(t->f[j] == NULL)
continue;
if(qr > t->f[j]->guys)
qr -= t->f[j]->guys;
else{
fout << j;
t = t->f[j];
break;
}
}
}
fout << "\n";
}
}
return 0;
}