Cod sursa(job #1534481)

Utilizator heracleRadu Muntean heracle Data 23 noiembrie 2015 19:11:30
Problema Nums Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#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;
}