Pagini recente » Cod sursa (job #2549334) | Cod sursa (job #1513553) | Cod sursa (job #2126505) | Cod sursa (job #2126346) | Cod sursa (job #2690421)
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
ifstream fin("nums.in");
ofstream fout("nums.out");
const int NMax = 1e5;
struct number{
int len;
int poz;
string s;
};
string S, getNumber[NMax + 5];
vector <number> V;
int norm[NMax + 5], Q[NMax + 5], AIB[NMax + 5], use[NMax + 5], T, N, t, k;
bool compare(number A, number B) {
if(A.len != B.len)
return A.len < B.len;
return A.s < B.s;
}
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.length(), i, S});
} else {
fin >> k;
Q[i] = k;
}
}
sort(V.begin(), V.end(), compare);
for(int i = 0; i < V.size(); ++i) {
if(i == 0 || V[i].s != V[i - 1].s)
V[N++] = V[i];
}
for(int i = 0; i < N; i++) {
norm[V[i].poz] = i + 1;
getNumber[i + 1] = V[i].s;
}
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 << getNumber[sol + 1] << '\n';
}
}
return 0;
}