Pagini recente » Borderou de evaluare (job #1736005) | Cod sursa (job #1926943) | Cod sursa (job #1992459) | Borderou de evaluare (job #1483669) | Cod sursa (job #2209578)
#include<bits/stdc++.h>
using namespace std;
ifstream f("nums.in");
ofstream g("nums.out");
int n;
int aib[100002];
void add(int nod)
{
for(;nod<=100000;nod+=(nod&(-nod)))
aib[nod]++;
}
int compute(int nod)
{
int sol=0;
for(;nod;nod-=(nod&(-nod)))
sol+=aib[nod];
return sol;
}
struct trie
{
trie *nod[10];
int counter;
trie()
{
counter=0;
memset(nod,NULL,sizeof(nod));
}
};
trie *r[100002];
string x;
bool gs()
{
if(!r[x.size()])
return 0;
trie *t=r[x.size()];
for(int i=0;i<x.size();++i)
{
int qq=x[i]-'0';
if(!t->nod[qq])
return 0;
t=t->nod[qq];
}
return 1;
}
void baga()
{
if(!r[x.size()])
r[x.size()]=new trie;
trie *t=r[x.size()];
++t->counter;
for(int i=0;i<x.size();++i)
{
int qq=x[i]-'0';
if(!t->nod[qq])
t->nod[qq]=new trie;
t=t->nod[qq];
++t->counter;
}
}
void qu(int unde,int rem)
{
trie *t=r[unde];
int sol=1;
for(int i=0;i<unde;++i)
{
int pnext=-1;
for(int j=0;j<10;++j)
if(t->nod[j])
{
if(t->nod[j]->counter<rem)
rem-=t->nod[j]->counter;
else
{
pnext=j;
break;
}
}
g<<pnext;
t=t->nod[pnext];
}
g<<'\n';
}
int main()
{
f>>n;
for(int i=1;i<=n;++i)
{
int tip;
f>>tip;
if(tip==1)
{
f>>x;
if(!gs())
{
add(x.size());
baga();
}
}
if(tip==0)
{
int nr;
f>>nr;
int stp=1;
for(;stp*2<=100000;stp*=2);
int qx=0;
for(;stp;stp>>=1)
{
if(stp+qx<=100000 && compute(stp+qx)<nr)
qx+=stp;
}
nr-=compute(qx);
++qx;
qu(qx,nr);
}
}
return 0;
}