Pagini recente » Cod sursa (job #591743) | Cod sursa (job #3239784) | Cod sursa (job #2090692) | Cod sursa (job #15759) | Cod sursa (job #50223)
Cod sursa(job #50223)
# 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;
}