Pagini recente » Cod sursa (job #692011) | Cod sursa (job #2541689) | Monitorul de evaluare | Cod sursa (job #2667567) | Cod sursa (job #1678615)
#include <fstream>
#include <cstring>
#include <string>
#include <utility>
using namespace std;
const int LMAX = 100005;
int aib[LMAX];
#define lsb(x) ((x) & (-(x)))
void update(int pos) {
for (; pos < LMAX; pos += lsb(pos))
++ aib[pos];
}
pair <int, int> binary_search(int k) {
-- k;
int pos = 0;
for (int i = 16; i >= 0; -- i)
if (pos + (1 << i) < LMAX && aib[pos + (1 << i)] <= k) {
pos += (1 << i);
k -= aib[pos];
}
return make_pair(k + 1, pos + 1);
}
struct trie {
int sz;
trie* alf[10];
trie(int _sz = 0): sz(_sz) {
memset(alf, NULL, sizeof alf);
}
} *roots[LMAX];
void insert(const string &str) {
if (roots[str.size()] == NULL)
roots[str.size()] = new trie;
trie *node = roots[str.size()];
update(str.size());
for (auto it: str) {
++ node -> sz;
if (node -> alf[it - '0'] == NULL)
node -> alf[it - '0'] = new trie;
node = node -> alf[it - '0'];
}
//Finalul
++ node -> sz;
}
string get_kth(int k) {
string ans;
pair <int, int> aux = binary_search(k);
k = aux.first;
trie *node = roots[aux.second];
while (1) {
int i;
for (i = 0; i < 10; ++ i)
if (node -> alf[i] != NULL) {
if (node -> alf[i] -> sz < k)
k -= node -> alf[i] -> sz;
else {
ans += (char)('0' + i);
node = node -> alf[i];
break;
}
}
if (i == 10)
break;
}
return ans;
}
int main()
{
ifstream cin("nums.in");
ofstream cout("nums.out");
int n = 0;
cin >> n;
bool type;
string str;
int k;
while (n --) {
cin >> type;
if (!type) {
cin >> k;
cout << get_kth(k) << '\n';
}
else {
cin >> str;
insert(str);
}
}
cin.close();
cout.close();
return 0;
}