Pagini recente » Cod sursa (job #2337360) | Cod sursa (job #2354628) | Cod sursa (job #1948679) | Cod sursa (job #3222642) | Cod sursa (job #2162898)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
using namespace std;
struct str1
{
int tip,poz;
}q[100010];
struct str
{
int poz;
string s;
}v[100010];
int aib[100010],logn,n;
char vaz[100010];
void update(int poz)
{
for(int i=poz;i<=n;i+=i&(-i))
aib[i]++;
}
int caut_bin(int val)
{
int poz=0;
for(int i=logn;i>=0;i--)
if(poz+(1<<i)<=n && aib[poz+(1<<i)]<val)
{
poz+=(1<<i);
val-=aib[poz];
}
return poz+1;
}
int cmp(str a,str b)
{
if(a.s.size()==b.s.size()) return a.s<b.s;
return a.s.size()<b.s.size();
}
int main()
{
ifstream f("nums.in");
ofstream g("nums.out");
int l=0;
f>>n;
while((1<<logn)<=n) logn++;
logn--;
for(int i=1;i<=n;i++)
{
f>>q[i].tip;
if(q[i].tip==1)
{
f>>v[++l].s;
v[l].poz=i;
}
else f>>q[i].poz;
}
sort(v+1,v+l+1,cmp);
q[v[1].poz].poz=1;
for(int i=2;i<=l;i++)
if(v[i].s==v[i-1].s) q[v[i].poz].poz=q[v[i-1].poz].poz;
else q[v[i].poz].poz=i;
for(int i=1;i<=n;i++)
if(q[i].tip==1 && vaz[q[i].poz]==0) {vaz[q[i].poz]=1;update(q[i].poz);}
else if(q[i].tip==0)
{
int poz=caut_bin(q[i].poz);
g<<v[poz].s<<"\n";
}
return 0;
}