Pagini recente » Cod sursa (job #1891378) | Cod sursa (job #221965) | Cod sursa (job #567610) | Cod sursa (job #213332) | Cod sursa (job #1667234)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
#ifdef INFOARENA
#define cout fout
#endif // INFOARENA
ifstream fin("nums.in");
ofstream fout("nums.out");
/// ////////////////////////////////
#define nmax 100003
struct T_NODE
{
T_NODE *fii[10];
int nr[10];
bool last;
T_NODE()
{
for(int i=0; i<10; ++i) fii[i]=0,nr[i]=0;
last=0;
}
};
T_NODE *tries[nmax];
int n,len;
char s[nmax],res[nmax],l;
int aib[nmax];
T_NODE *alpha_root;
void trie_add(T_NODE *nod, int p)
{
if(p==len)
{
nod->last=1;
return;
}
int son=s[p]-48;
if(!nod->fii[son]) nod->fii[son]=new T_NODE();
++nod->nr[son];
trie_add(nod->fii[son],p+1);
}
void trie_query(T_NODE *nod,int k)
{
if(nod->last) return;
int son;
for(son=0; k>0; ++son) k-=nod->nr[son];
--son;
res[++l]=son+48;
trie_query(nod->fii[son],k+nod->nr[son]);
}
void update_aib(int pos)
{
for(; pos<nmax; pos+=(pos&(-pos))) ++aib[pos];
}
int query_aib(int &k)
{
int step,pos=0;
step=65536;
for(; step; step>>=1)
if(pos+step<nmax)
if(aib[pos+step]<k)
{
pos+=step;
k-=aib[pos];
}
return pos;
}
int main()
{
int i,tip,k,pos;
alpha_root=new T_NODE();
tries[100000]=alpha_root;
for(i=99999;i;--i)
tries[i]=(tries[i+1]->fii[0] = new T_NODE());
fin>>n;
for(i=1; i<=n; ++i)
{
fin>>tip;
if(tip==1)
{
fin>>s;
len=strlen(s);
trie_add(tries[len],0);
update_aib(len);
}
else
{
fin>>k;
pos=query_aib(k);
++pos;
l=-1;
trie_query(tries[pos],k);
res[++l]='\0';
cout<<res<<'\n';
}
}
return 0;
}