Pagini recente » Cod sursa (job #1789102) | Cod sursa (job #718778) | Cod sursa (job #3155511) | Cod sursa (job #389354) | Cod sursa (job #2605105)
#include <bits/stdc++.h>
using namespace std;
const int N_MAX = 100002;
const int D_MAX = 100002;
int n;
struct Operation
{
bool type;
int k;
string str;
};
Operation op[N_MAX];
unordered_set <string> us;
vector <int> vd[D_MAX];
vector <int> aux;
int cnt[10];
void radix (vector <int> &v, int d)
{
aux.resize(v.size());
for(int i = 0; i <= 9; i++)
cnt[i] = 0;
for(int i : v)
{
int digit = op[i].str[d] - '0';
if(digit < 9)
cnt[digit + 1]++;
}
for(int i = 1; i <= 9; i++)
cnt[i] += cnt[i - 1];
for(int i : v)
{
int digit = op[i].str[d] - '0';
aux[cnt[digit]++] = i;
}
v = aux;
}
void radixSort (vector <int> &v, int d)
{
for(int i = 0; i < d; i++)
radix(v, i);
}
vector <int> vsort;
int vn[N_MAX];
int BIT[N_MAX];
void update (int pos)
{
for(int i = pos; i <= (int)vsort.size(); i += i & -i)
BIT[i]++;
}
int query (int k)
{
int ans = 0;
for(int step = 19; step >= 0; step--)
if(ans + (1 << step) <= (int)vsort.size() && BIT[ans + (1 << step)] < k)
{
ans += (1 << step);
k -= BIT[ans];
}
return ans + 1;
}
int main()
{
ifstream fin ("nums.in");
ofstream fout ("nums.out");
fin >> n;
for(int i = 1; i <= n; i++)
{
fin >> op[i].type;
if(op[i].type == 0)
fin >> op[i].k;
else
{
fin >> op[i].str;
if(us.find(op[i].str) != us.end())
continue;
us.insert(op[i].str);
reverse(op[i].str.begin(), op[i].str.end());
vd[(int)op[i].str.size()].push_back(i);
}
}
for(int i = 1; i < D_MAX; i++)
if(vd[i].size() > 0)
{
if(vd[i].size() > 1)
radixSort(vd[i], i);
for(int j : vd[i])
{
vsort.push_back(j);
vn[j] = vsort.size();
}
}
for(int i = 1; i <= n; i++)
if(op[i].type == 1)
{
if(vn[i] > 0)
update(vn[i]);
}
else
{
string s = op[vsort[query(op[i].k) - 1]].str;
reverse(s.begin(), s.end());
fout << s << "\n";
}
return 0;
}