Pagini recente » Cod sursa (job #1513559) | Cod sursa (job #2146842) | Cod sursa (job #1891345) | Cod sursa (job #2044028) | Cod sursa (job #2690396)
#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;
}
bool equalFunc(pp A, pp B) {
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);
V.resize(distance(V.begin(), unique(V.begin(), V.end(), equalFunc)));
for(auto x : V) {
norm[x.second] = ++N;
number[N] = x.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;
}