Pagini recente » Cod sursa (job #890167) | Cod sursa (job #1213596) | Cod sursa (job #103327) | Cod sursa (job #1762437) | Cod sursa (job #593407)
Cod sursa(job #593407)
#include <stdio.h>
#include <string.h>
#define LMAX 100005
#define HMAX 10
int t,aib[LMAX];
char line[LMAX];
struct trie
{
int nr,pass;
trie *fiu[HMAX];
trie()
{
nr=0; pass=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *T[LMAX];
void init()
{
int i;
for (i=1; i<LMAX; i++)
T[i]=new trie;
}
inline int cif(char x)
{
return x>='0' & x<='9';
}
int find(trie *nod,char *s)
{
if (*s=='\n')
return nod->nr;
if (nod->fiu[*s-'0']==0)
return 0;
return find(nod->fiu[*s-'0'],s+1);
}
void ins(trie *nod,char *s)
{
nod->pass++;
if (*s=='\n')
{
nod->nr++;
return ;
}
if (nod->fiu[*s-'0']==0)
nod->fiu[*s-'0']=new trie;
ins(nod->fiu[*s-'0'],s+1);
}
int lsb(int x)
{
return x & -x;
}
void update(int x,int val)
{
int i;
for (i=x; i<LMAX; i+=lsb(i))
aib[i]+=val;
}
int suma(int x)
{
int i,s=0;
for (i=x; i>0; i-=lsb(i))
s+=aib[i];
return s;
}
int cbin(int val)
{
int i,step=(1<<16);
for (i=0; step; step>>=1)
if (i+step<LMAX && suma(i+step)<val)
i+=step;
return ++i;
}
void reconst(trie *nod,int val)
{
int i,val2=val;
for (i=0; i<=9; i++)
if (nod->fiu[i])
{
if ((nod->fiu[i])->pass<val2)
val2-=(nod->fiu[i])->pass;
else
{
printf("%d",i);
reconst(nod->fiu[i],val2);
return ;
}
}
}
int main()
{
freopen("nums.in","r",stdin);
freopen("nums.out","w",stdout);
init();
scanf("%d\n",&t);
int i,tip,x,y,z,poz;
for (i=1; i<=t; i++)
{
scanf("%d",&tip);
if (tip==1)
{
fgets(line+1,LMAX,stdin);
x=0; poz=1;
while (cif(line[poz+1])) poz++,x++;
if (!find(T[x],line+2))
{
update(x,1);
ins(T[x],line+2);
}
}
if (tip==0)
{
scanf("%d",&y);
z=cbin(y);
y-=suma(z-1);
//reconst(T[z],y);
printf("\n");
}
}
return 0;
}