Pagini recente » Cod sursa (job #1882961) | Cod sursa (job #2842469) | Cod sursa (job #1720852) | Cod sursa (job #288745) | Cod sursa (job #1534481)
#include <cstdio>
#include <unordered_map>
FILE* in=fopen("nums.in","r");
FILE* out=fopen("nums.out","w");
struct trie
{
// trie *nxt[10];
std::unordered_map<char, trie*> nxt;
int nrtot;
trie()
{
nrtot=0;
}
} *rad[100007];
char input[(6<<20)+29999];
int n;
int p=0;
char aux[100007];
bool adaos;
trie *add(trie *nod, char v[])
{
if(nod==NULL)
nod=new trie;
if(v[0]==-1)
{
if(nod->nrtot==0)
{
nod->nrtot++;
adaos=1;
}
else
adaos=0;
return nod;
}
nod->nxt[v[0]]=add(nod->nxt[v[0]],v+1);
nod->nrtot+=adaos;
return nod;
}
int aib[130007];
int ask(int &x)
{
int pst=0,pow=1<<16;
while(pow)
{
if(aib[pow+pst]<x)
{
pst+=pow;
x-=aib[pst];
}
pow/=2;
}
return pst+1;
}
void update(int poz, int val)
{
while(poz<130007)
{
aib[poz]+=val;
poz+=poz&(-poz);
}
}
int contor;
void afis(trie *nod, int nr)
{
for(int i=0; i<=9; i++)
{
if(nod->nxt[i])
{
if(nod->nxt[i]->nrtot<nr)
{
nr-=nod->nxt[i]->nrtot;
}
else
{
aux[++contor]=i+'0';
afis(nod->nxt[i],nr);
return;
}
}
}
}
int main()
{
fscanf(in,"%d",&n);
fread(input,6<<20,1,in);
int act;
int ax;
for(int i=1; i<=n; i++)
{
p++;
if(input[p]=='0')
{
p+=2;
act=0;
while(input[p]!='\n')
{
act=act*10+input[p]-'0';
p++;
}
ax=ask(act);
contor=0;
afis(rad[ax],act);
aux[++contor]=0;
fputs(aux+1,out);
fprintf(out,"\n");
}
else
{
p+=2;
act=0;
while(input[p]!='\n')
{
aux[act]=input[p]-'0';
p++;
act++;
}
aux[act]=-1;
if(rad[act])
ax=rad[act]->nrtot;
else
ax=0;
rad[act]=add(rad[act],aux);
update(act, rad[act]->nrtot-ax);
}
}
return 0;
}