Pagini recente » Cod sursa (job #104852) | Cod sursa (job #292825) | Cod sursa (job #3129477) | Cod sursa (job #1391745) | Cod sursa (job #1953683)
/* Input : insert strings
query find k-th string in lexicographical order
Solution :
*/
#include <bits/stdc++.h>
#define maxN 100002
#define zeros(x) x&(-x)
FILE *fin = freopen("nums.in", "r", stdin);
FILE *fout = freopen("nums.out", "w", stdout);
using namespace std;
int Q, m;
string str;
struct Elem{
string s;
int idx;
} e[maxN];
int cmp(const Elem a, const Elem b){
if (a.s.size() == b.s.size())
return a.s < b.s;
return a.s.size() < b.s.size();
}
struct Query{
int t, kth, pos;
} q[maxN];
bool used[maxN];
int aib[maxN];
void update(int pos){
for(int i = pos; i <= Q; i += zeros(i))
aib[i] += 1;
}
int kthElement(int k){
int i = 0, p = 1 << 16;
while(p){
if(i + p <= m && aib[i + p] < k){
i += p;
k -= aib[i];
}
p >>= 1;
}
return i + 1;
}
void queries(){
for(int i = 1; i <= Q; ++ i){
if(q[i].t && !used[q[i].pos]){
update(q[i].pos);
used[q[i].pos] = 1;
}
if(!q[i].t){
int pos = kthElement(q[i].kth);
cout << e[pos].s << "\n";
}
}
}
int main(){
/*------Read Input----*/
cin >> Q;
for(int i = 1; i <= Q; ++ i){
cin >> q[i].t;
if(q[i].t){
cin >> e[++ m].s;
e[m].idx = i;
}
else cin >> q[i].kth;
}
/*-----MyNorm---------*/
sort(e + 1, e + m + 1, cmp);
for(int i = 1; i <= m; ++ i){
int j = i;
while(e[i].s == e[j].s && j <= m){
q[e[j].idx].pos = i;
++ j;
}
i = j - 1;
}
queries();
return 0;
}