Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Istoria paginii utilizator/gunfus | Cod sursa (job #1953670)
/* 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;
}
void query(int pos){
int ans = 0;
for(int i = pos; i > 0; i -= zeros(i))
ans += aib[i];
}
int kthElement(int k){
int i = 0, p = 1 << 16;
while(p){
if(i + p <= Q && 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;
printf("\n");
}
}
}
int main(){
/*------Read Input----*/
scanf("%d", &Q);
for(int i = 1; i <= Q; ++ i){
scanf("%d ", &q[i].t);
if(q[i].t){
++ m;
cin >> e[m].s;
e[m].idx = i;
}
else scanf("%d", &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;
}