Pagini recente » Cod sursa (job #882568) | Cod sursa (job #1104218) | Cod sursa (job #332398) | Cod sursa (job #98733) | Cod sursa (job #1474449)
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("nums.in");
ofstream fout("nums.out");
struct Num {
string str;
int order, indx;
};
int N;
vector<Num> v;
vector<pair<int, int>> q;
vector<int> aib, ans;
void Add(int p) {
for (int i = p; i <= N; i += i & -i)
++aib[i];
}
int Search(int k) {
int ans = 0;
for (int step = 1 << 17; step; step >>= 1)
if ((ans ^ step) <= N && aib[ans ^ step] < k)
k -= aib[ans ^= step];
return ans;
}
int main() {
fin >> N;
q.resize(N);
for (auto &it : q) {
fin >> it.first;
if (it.first == 0) {
fin >> it.second;
} else {
it.second = v.size();
v.push_back(Num());
fin >> v.back().str;
v.back().indx = it.second;
}
}
N = v.size();
sort(v.begin(), v.end(), [&](const Num &lhs, const Num &rhs) {
if (lhs.str.size() == rhs.str.size())
return lhs.str < rhs.str;
return lhs.str.size() < rhs.str.size();
});
for (int i = 0; i < int(v.size()); ++i)
v[i].order = i;
sort(v.begin(), v.end(), [&](const Num &lhs, const Num &rhs) {
return lhs.indx < rhs.indx;
});
aib.resize(N + 1);
for (const auto &it : q)
if (it.first == 0)
ans.push_back(Search(it.second));
else
Add(v[it.second].order + 1);
sort(v.begin(), v.end(), [&](const Num &lhs, const Num &rhs) {
return lhs.order < rhs.order;
});
for (int i : ans)
fout << v[i].str << "\n";
return 0;
}