Pagini recente » Cod sursa (job #1381906) | Cod sursa (job #2512946) | Cod sursa (job #9554) | lh10-2 | Cod sursa (job #1003400)
#include <cstdio>
#include <string>
#include <algorithm>
#define MaxN 100100
using namespace std;
int n, nr, poz;
pair<string, int> words[MaxN];
int op[MaxN], val[MaxN], a[3*MaxN], ind[MaxN];
char lin[MaxN], used[MaxN];
bool comp(const pair<string, int> &x, const pair<string, int> &y){
const string &a = x.first;
const string &b = y.first;
if (a.length() != b.length()) {
return a.length() < b.length();
}
unsigned last = a.length() / sizeof(int), poz = 0;
const int *s1 = (int *)a.c_str();
const int *s2 = (int *)b.c_str();
while (poz < last && s1[poz] == s2[poz]) {
poz++;
}
unsigned k = 4 * poz;
while (k + 1 < a.length() && a[k] == b[k])
k++;
return a[k] < b[k];
}
void baga(int p, int u, int r){
a[r]++;
if (p >= u)
return;
int mij = (p+u)/2;
if (poz <= mij)
baga(p, mij, 2*r);
else
baga(mij+1, u, 2*r+1);
}
int query(int p, int u, int r){
if (p == u)
return p;
int mij = (p+u)/2;
if (a[2*r] >= poz)
return query(p, mij, 2*r);
else {
poz -= a[2*r];
return query(mij+1, u, 2*r+1);
}
}
int main(){
freopen("nums.in", "r", stdin);
freopen("nums.out", "w", stdout);
scanf("%d", &n);
for (int i=0; i<n; i++){
scanf("%d %s", op+i, lin);
if (op[i] == 1)
words[nr++] = make_pair(lin, i);
else
sscanf(lin, "%d", val+i);
}
sort(words, words+nr, comp);
int k = 1;
for (int i=0; i<nr; i++){
val[words[i].second] = k;
ind[k] = i;
if (words[i].first != words[i+1].first)
k++;
}
for (int i=0; i<n; i++)
if (op[i] == 1){
poz = val[i];
if (used[poz])
continue;
used[poz] = true;
baga(1, nr, 1);
} else {
poz = val[i];
printf("%s\n", words[ind[query(1, nr, 1)]].first.c_str());
}
return 0;
}