Pagini recente » Cod sursa (job #76251) | Cod sursa (job #2343712) | Cod sursa (job #3286458) | Cod sursa (job #2612553) | Cod sursa (job #2061715)
#include <fstream>
#include <string>
#include <map>
#include <algorithm>
#define DIM 100001
using namespace std;
ifstream fi("nums.in");
ofstream fo("nums.out");
pair<string,int> num[DIM];
pair<int, string> Q[DIM];
map<string,pair<int,int> > U;
int n;
int tip;
int AIB[DIM];
int nru;
int lsb(int x)
{
return ((x^(x-1))&x);
}
void update(int poz,int val)
{
for(int i=poz;i<DIM;i+=lsb(i))
AIB[i]+=val;
}
string query(int poz)
{
int p=0;
for(int i=DIM;i>0;i>>=1)
if(p+i<=nru&&AIB[p+i]<=poz)
poz-=AIB[p+i],p+=i;
return num[p].first;
}
bool compar(pair<string,int> a,pair<string,int> b)
{
if(a.first.size()<b.first.size())
return true;
if(a.first.size()>b.first.size())
return false;
return a.first<b.first;
}
int numar(string s)
{
int rez=0;
for(auto it:s)
rez=rez*10+(it-'0');
return rez;
}
int main()
{
fi>>n;
for(int i=1;i<=n;i++)
{
string s;
fi>>tip>>s;
Q[i].first=tip,Q[i].second=s;
if(tip==1)
num[++nru].first=s,num[nru].second=i;
}
sort(num+1,num+nru+1,compar);
for(int i=1;i<=nru;i++)
U[num[i].first]=make_pair(i,0);
for(int i=1;i<=n;i++)
{
if(Q[i].first==1&&U[Q[i].second].second==0)
update(U[Q[i].second].first,1);
else
fo<<query(numar(Q[i].second))<<"\n";
}
fi.close();
fo.close();
return 0;
}