Pagini recente » Cod sursa (job #2720427) | Cod sursa (job #2711502) | Cod sursa (job #2152967) | Cod sursa (job #2424627) | Cod sursa (job #2690410)
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#define pp pair<string, int>
using namespace std;
ifstream fin("nums.in");
ofstream fout("nums.out");
const int NMax = 1e5;
string S, number[NMax + 5];
vector <pp> V;
int norm[NMax + 5], Q[NMax + 5], AIB[NMax + 5], use[NMax + 5], T, N, t, k;
bool compare(pp A, pp B) {
if(A.first.length() != B.first.length())
return A.first.length() < B.first.length();
return A.first < B.first;
}
void updateAIB(int poz) {
for(int i = poz; i <= N; i += (i & (-i)))
AIB[i]++;
}
int queryAIB(int poz) {
int sum = 0;
for(int i = poz; i > 0; i -= (i & (-i)))
sum += AIB[i];
return sum;
}
int main()
{
fin >> T;
for(int i = 1; i <= T; ++i) {
fin >> t;
if(t == 1) {
fin >> S;
V.push_back({S, i});
} else {
fin >> k;
Q[i] = k;
}
}
sort(V.begin(), V.end(), compare);
for(int i = 0; i < V.size(); ++i) {
if(i == 1 || V[i].first != V[i - 1].first)
V[N++] = V[i];
}
for(int i = 0; i < N; i++) {
norm[V[i].second] = i + 1;
number[i + 1] = V[i].first;
}
for(int i = 1; i <= T; i++) {
if(Q[i] == 0) {
if(!use[norm[i]])
updateAIB(norm[i]);
use[norm[i]] = true;
} else {
int sol = 0;
for(int step = (1 << 16); step > 0; step >>= 1) {
if(sol + step <= N && queryAIB(sol + step) < Q[i])
sol += step;
}
fout << number[sol + 1] << '\n';
}
}
return 0;
}