Pagini recente » Cod sursa (job #1615732) | Cod sursa (job #1028821) | Cod sursa (job #2067678) | Cod sursa (job #2197658) | Cod sursa (job #1679164)
#include <fstream>
#include <algorithm>
#include <string>
#include <vector>
#include <utility>
using namespace std;
const int LMAX = 100005;
struct query {
bool type;
int k;
int nr_str;
} queries[LMAX];
bool _less(const pair <string, int> &a, const pair <string, int> &b) {
if (a.first.size() != b.first.size())
return a.first.size() < b.first.size();
return a.first < b.first;
}
bool _equal(const pair <string, int> &a, const pair <string, int> &b) {
return a.first == b.first;
}
vector <pair <string, int> > v;
int aib[LMAX];
#define lsb(x) ((x) & (-(x)))
void update(int pos) {
for (; pos <= v.size(); pos += lsb(pos))
++ aib[pos];
}
int binary_search(int k) {
int pos = 0;
for (int i = 16; i >= 0; -- i)
if (pos + (1 << i) <= v.size() && aib[pos + (1 << i)] < k) {
pos += (1 << i);
k -= aib[pos];
}
return pos;
}
int main()
{
ifstream cin("nums.in");
ofstream cout("nums.out");
int n = 0;
cin >> n;
string str;
for (int i = 1; i <= n; ++ i) {
cin >> queries[i].type;
if (!queries[i].type)
cin >> queries[i].k;
else {
cin >> str;
v.push_back(make_pair(str, i));
}
}
stable_sort(v.begin(), v.end(), _less);
v.resize(unique(v.begin(), v.end(), _equal) - v.begin());
for (int i = 0; i < v.size(); ++ i)
queries[v[i].second].nr_str = i + 1;
for (int i = 1; i <= n; ++ i)
if (!queries[i].type)
cout << v[binary_search(queries[i].k)].first << '\n';
else if (queries[i].nr_str)
update(queries[i].nr_str);
cin.close();
cout.close();
return 0;
}