Pagini recente » Cod sursa (job #1313356) | Cod sursa (job #348198) | Cod sursa (job #318915) | Cod sursa (job #1440793) | Cod sursa (job #2162697)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
struct trie
{
int nr;
vector<int> v;
trie()
{
nr=0;
v.resize(10);
}
};
const int lim=100005;
vector<trie> arb[100010];
char sir[100010];
int aib[lim+10],logn;
void aib_update(int poz)
{
for(int i=poz;i<=lim;i+=i&(-i))
aib[i]++;
}
int query(int poz)
{
int s=0;
for(int i=poz;i>0;i-=i&(-i))
s+=aib[i];
return s;
}
int caut_bin(int val)
{
int poz=0;
for(int i=logn;i>=0;i--)
if(poz+(1<<i)<=lim && aib[poz+(1<<i)]<val)
{
poz+=(1<<i);
val-=aib[poz];
}
return poz+1;
}
void update()
{
scanf(" %s\n",sir+1);
int l=strlen(sir+1),nod=0,p=0;
aib_update(l);
for(int i=1;i<=l;i++)
{
if(arb[l][nod].v[sir[i]-'0']==0)
{
p=1;
arb[l].push_back(trie());
arb[l][nod].v[sir[i]-'0']=arb[l].size()-1;
}
nod=arb[l][nod].v[sir[i]-'0'];
arb[l][nod].nr++;
}
if(p==0)
{
nod=0;
for(int i=1;i<=l;i++)
{
nod=arb[l][nod].v[sir[i]-'0'];
arb[l][nod].nr--;
}
}
}
void solve(int k,int l)
{
int nod=0;
char ch;
for(int i=1;i<=l;i++)
{
for(int j=0;j<=9;j++)
{
int nod1=arb[l][nod].v[j];
if(k<=arb[l][nod1].nr) {nod=nod1;ch='0'+j;break;}
else k-=arb[l][nod1].nr;
}
printf("%c",ch);
}
printf("\n");
}
int main()
{
freopen("nums.in","r",stdin);
freopen("nums.out","w",stdout);
int n,k,t;
scanf("%d",&n);
while((1<<logn)<=lim) logn++;
logn--;
for(int i=1;i<=lim;i++) arb[i].push_back(trie());
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
if(t==1) update();
else
{
scanf("%d",&k);
int poz=caut_bin(k);
if(query(poz)<k) poz++;
k-=query(poz-1);
solve(k,poz);
}
}
return 0;
}