Pagini recente » Cod sursa (job #3285385) | Cod sursa (job #2862628) | Cod sursa (job #436866) | Cod sursa (job #2908129) | Cod sursa (job #1315667)
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
struct str
{
int tip,x;
}v[100010];
struct numar
{
int x;
string nr;
}v1[100010];
int aib[100010],n,logn;
int cmp(numar a,numar b)
{
if(a.nr.size()==b.nr.size()) return a.nr<b.nr;
else return a.nr.size()<b.nr.size();
}
void aib_update(int i)
{
for(;i<=n;i+=i&(-i)) aib[i]++;
}
int kthelement(int k)
{
int x=0;
for(int i=logn;i>=0;i--)
if(x+(1<<i)<=n && k>aib[x+(1<<i)])
{
x+=1<<i;
k-=aib[x];
}
return x+1;
}
int main()
{
ifstream f("nums.in");
ofstream g("nums.out");
int m=0;
f>>n;
for(logn=1;1<<(logn+1)<=n;logn++);
for(int i=1;i<=n;i++)
{
f>>v[i].tip;
if(v[i].tip)
{
f>>v1[++m].nr;
v1[m].x=i;
}
else f>>v[i].x;
}
sort(v1+1,v1+1+m,cmp);
for(int i=1;i<=m;i++)
if(v1[i].nr==v1[i-1].nr) v[v1[i].x].x=v[v1[i-1].x].x;
else v[v1[i].x].x=i;
for(int i=1;i<=n;i++)
if(v[i].tip) aib_update(v[i].x);
else g<<v1[kthelement(v[i].x)].nr<<"\n";
return 0;
}