Cod sursa(job #50223)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 7 aprilie 2007 00:58:15
Problema Subsir 2 Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
# include <stdio.h>

const int MAXN=5000;
long int n,stack[MAXN+1],card[MAXN+1],stacklen,v[MAXN+1],sol[MAXN+1],sol2[MAXN+1],ls;

void citire()
{
FILE *f=fopen("subsir2.in","r");
fscanf(f,"%ld",&n);
long int i;
for (i=1;i<=n;i++) fscanf(f,"%ld",&v[i]);
fclose(f);
}

long int find(long int val)
{
long int li=1,lf=stacklen,mij;
while (li<=lf)
	{
	mij=(li+lf)/2;
	if (stack[mij]>val&&(mij-1==0||stack[mij-1]<val)) return mij;
	else if (stack[mij]<val) li=mij+1;
	else lf=mij-1;
	}
return ++stacklen;
}

void calculeaza()
{
long int i,poz;
for (i=1;i<=n;i++)
	{
	poz=find(v[i]);
	stack[poz]=v[i];
	card[i]=poz;
	}
}

/*void elim_backgroundless()
{
long int i;
long int minim[MAXN+1];
for (i=1;i<=n;i++) minim[i]=2*n;
for (i=n;i>=1;i--)
	if (card[i]==stacklen)
		{
		if (minim[stacklen]>v[i]) minim[stacklen]=v[i];
		}
	else
		{
		if (minim[card[i]+1]<v[i]) card[i]=0;
		else
			if (minim[card[i]]>v[i]) minim[card[i]]=v[i];
		}
} */

void pick_solution()
{
long int i;
for (i=1;i<=n;i++) sol[i]=1000001;
for (i=1;i<=n;i++)
	if (sol[card[i]]>v[i])
		{
		sol[card[i]]=v[i];
		sol2[card[i]]=i;
		}
}


void scrie()
{
FILE *g=fopen("subsir2.out","w");
fprintf(g,"%ld\n",stacklen);
long int i;
for (i=1;i<=stacklen-1;i++)
	fprintf(g,"%ld ",sol2[i]);
fprintf(g,"%ld\n",sol2[stacklen]);
fcloseall();
}

int main()
{
citire();
calculeaza();
//elim_backgroundless();
pick_solution();
scrie();
return 0;
}