Pagini recente » Cod sursa (job #526227) | Cod sursa (job #2654460) | Cod sursa (job #2558391) | Cod sursa (job #3284661) | Cod sursa (job #760423)
Cod sursa(job #760423)
#include <iostream>
#include <fstream>
#include <string>
#include <set>
#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];
int norm[DN];
set<string> s;
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<=sz; i+=lsb(i)) ++aib[i];
}
int search(int x) {
int i,pd;
for(pd=1;pd<=sz;pd<<=1);
for(i=0;pd;pd>>=1) if(i+pd<=sz && 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;
if(op[i].x) ++sz;
ind[i]=i;
}
sort(ind+1,ind+n+1,cmp);
for(int i=1; i<=n; ++i) norm[ind[i]]=i;
//for(int i=1; i<=n; ++i) cout<<norm[i]<<' '<<op[i].x<<' '<<op[i].y<<'\n';
for(int i=1; i<=n; ++i) {
if(op[i].x && s.find(op[i].y)==s.end()) {
update(norm[i]);
s.insert(op[i].y);
}
else if(!op[i].x){
int unde=search(conv(op[i].y));
//cout<<unde<<' ';
g<<op[ind[unde]].y<<'\n';
}
}
return 0;
}