Pagini recente » Cod sursa (job #2692991) | Cod sursa (job #3040652) | Cod sursa (job #3039494) | Cod sursa (job #3215417) | Cod sursa (job #1965632)
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#define nmax 100010
using namespace std;
ifstream fin("nums.in");
ofstream fout("nums.out");
int i,j,n,type,strings=0,different=1,step,answer,before;
int query[nmax],aib[nmax],seen[nmax];
string s[nmax],sn[nmax],sf[nmax];
bool Compare(string a,string b){
if(a.size()!=b.size())
return a.size()<b.size();
return a<b;
}
int main()
{
fin >> n;
for(i=1;i<=n;i++){
fin >> type;
if(type==0)
fin >> query[i];
else{
fin >> s[i];
strings++;
sn[strings]=s[i];
}
}
sort(sn+1,sn+strings+1,Compare);
sf[1]=sn[1];
for(i=2;i<=strings;i++)
if(sn[i]!=sn[i-1]){
different++;
sf[different]=sn[i];
}
for(i=1;i<=n;i++)
if(query[i]!=0){
answer=before=0;
for(step=(1<<16);step>0;step/=2)
if(answer+step<different and before+aib[answer+step]<query[i]){
before+=aib[answer+step];
answer+=step;
}
fout << sf[answer+1]<<endl;
}
else{
answer=0;
for(step=(1<<16);step>0;step/=2)
if(answer+step<=different and Compare(s[i],sf[answer+step])==0)
answer+=step;
if(seen[answer]==0){
seen[answer]=1;
for(j=answer;j<=different;j=j+((j&(j-1))^j))
aib[j]++;
}
}
return 0;
}