Pagini recente » Istoria paginii runda/eusebiu_oji_2015_cls9/clasament | Cod sursa (job #1705556) | Monitorul de evaluare | Cod sursa (job #2388827) | Cod sursa (job #2209606)
#include<bits/stdc++.h>
using namespace std;
ifstream f("nums.in");
ofstream g("nums.out");
int n,cate;
int aib[100002];
bool prs[100002];
struct qx
{
int tip,pos,poss,pi;
string x;
};
qx v[100002];
struct str
{
string x;
};
str v2[100002];
void add(int nod)
{
for(;nod<=cate;nod+=(nod&(-nod)))
aib[nod]++;
}
int compute(int nod)
{
int sol=0;
for(;nod;nod-=(nod&(-nod)))
sol+=aib[nod];
return sol;
}
bool cmp(qx a, qx b)
{
if(a.x.size()!=b.x.size())
return a.x.size()<b.x.size();
for(int i=0;i<a.x.size();++i)
if(a.x[i]!=b.x[i])
return a.x[i]<b.x[i];
if(a.tip)
return a.tip<b.tip;
}
bool cmp2(qx a, qx b)
{
return a.pi<b.pi;
}
int main()
{
f>>n;
for(int i=1;i<=n;++i)
{
f>>v[i].tip;
if(v[i].tip==1)
{
f>>v[i].x;
++cate;
v2[cate].x=v[i].x;
}
else
f>>v[i].pos;
v[i].pi=i;
}
sort(v+1,v+n+1,cmp);
int c2=0;
for(int i=1;i<=n;++i)
{
if(i==1)
v2[++c2].x=v[i].x;
else
if(v[i].x!=v2[c2].x)
v2[++c2].x=v[i].x;
}
cate=c2;
int cc=1;
for(int i=1;i<=n;++i)
{
if(v[i].x!=v2[cc].x)
++cc;
v[i].poss=cc;
}
sort(v+1,v+n+1,cmp2);
for(int i=1;i<=n;++i)
{
if(v[i].tip==1)
{
if(!prs[v[i].poss])
add(v[i].poss),prs[v[i].poss]=1;
}
else
{
int b=1;
int e=cate;
while(b<=e)
{
int mid=(b+e)/2;
int valx=compute(mid);
int valy=compute(mid-1);
if(valx==v[i].pos && valy<v[i].pos)
{
g<<v2[mid].x<<'\n';
break;
}
if(valx>v[i].pos)
e=mid-1;
else
b=mid+1;
}
}
}
return 0;
}