Cod sursa(job #760393)
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#define DN 100005
#define x first
#define y second
using namespace std;
int n,ind[DN],sz,aib[DN];
pair<int,string> op[DN];
bool cmp(const int &a, const int &b) {
if(!op[a].x) return 0;
if(!op[b].x) return 1;
if(op[a].y.size()==op[b].y.size()) return op[a].y.compare(op[b].y)<0;
return op[a].y.size()<op[b].y.size();
}
inline int lsb(int n) {
return (n&(n-1))^n;
}
void update(int x) {
for(int i=x; i<=n; i+=lsb(i)) ++aib[i];
}
int search(int x) {
int i,pd;
for(pd=1;pd<n;pd<<=1);
for(i=0;pd;pd>>=1) if(i+pd<=n && x>=aib[i+pd]) {
i+=pd; x-=aib[i];
if(0==x) return i;
}
}
int conv(string s) {
int r=0;
for(int i=0; i<s.size(); ++i)
r=r*10+s[i]-'0';
return r;
}
int main()
{
ifstream f("nums.in");
ofstream g("nums.out");
f>>n;
for(int i=1; i<=n; ++i) {
f>>op[i].x>>op[i].y;
ind[i]=i;
if(op[i].x) ++sz;
}
sort(ind+1,ind+n+1,cmp);
for(int i=1; i<=n; ++i) {
if(op[i].x) update(ind[i]);
else {
int unde=search(conv(op[i].y))-1;
g<<op[ind[unde]].second<<'\n';
}
}
return 0;
}