Pagini recente » Cod sursa (job #598756) | Cod sursa (job #809746) | Cod sursa (job #2861831) | Cod sursa (job #2262714) | Cod sursa (job #1838238)
/// ...
#include <bits/stdc++.h>
#define maxN 100005
#define maxLog 16
#define lsb(x) ((x)&(-x))
using namespace std;
string num[maxN],str[maxN],_input[maxN];
int n,nrs,nrdif,i,op,pos,sol,sum,step;
int qry[maxN],aib[maxN];
bool seen[maxN];
bool cmp(const string &a,const string &b)
{
if(a.size()==b.size())
return a<b;
return a.size()<b.size();
}
void update(int pos,int val)
{
for(int i=pos;i<=nrdif;i+=lsb(i))
aib[i]+=val;
}
int main()
{
ifstream f("nums.in");
ofstream g("nums.out");
f>>n;
for(i=1;i<=n;i++)
{
f>>op;
if(!op)
f>>qry[i];
else f>>_input[i],num[++nrs]=_input[i];
}
sort(num+1,num+nrs+1,cmp);
str[++nrdif]=num[1];
for(i=2;i<=nrs;i++)
if(num[i]!=num[i-1])
str[++nrdif]=num[i];
for(i=1;i<=n;i++)
{
if(!qry[i])
{
pos=0;
for(step=1<<maxLog;step>0;step>>=1)
if(pos+step<=nrdif && cmp(_input[i],str[pos+step])==0)
pos+=step;
if(!seen[pos])
update(pos,1),
seen[pos]=true;
}
else
{
sol=sum=0;
for(step=1<<maxLog;step>0;step>>=1)
if(sol+step<nrdif && sum+aib[sol+step]<qry[i])
sol+=step,sum+=aib[sol];
g<<str[sol+1]<<'\n';
}
}
return 0;
}