Pagini recente » Cod sursa (job #106107) | Cod sursa (job #655283) | Cod sursa (job #2639171) | Cod sursa (job #661220) | Cod sursa (job #2163139)
#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(;poz<=n;poz+=poz&(-poz))
aib[poz]++;
}
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;
else return a.s.size()<b.s.size();
}
void sortare(int st,int dr)
{
int i=st,j=dr;
str mid=v[(i+j)/2],aux;
do
{
while(cmp(v[i],mid)) i++;
while(cmp(mid,v[j])) j--;
if(i<=j)
{
aux=v[i];
v[i]=v[j];
v[j]=aux;
i++;
j--;
}
}while(i<=j);
if(st<j) sortare(st,j);
if(dr>i) sortare(i,dr);
}
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;
}
sortare(1,l);
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)
{
if(vaz[q[i].poz]==0)
{
vaz[q[i].poz]=1;
update(q[i].poz);
}
}
else g<<v[caut_bin(q[i].poz)].s<<"\n";
return 0;
}