Cod sursa(job #221281)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 15 noiembrie 2008 14:11:15
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>
#define inf 2000000000
FILE*fin=fopen("scmax.in","r");
FILE*fout=fopen("scmax.out","w");
int n,s[100001],t[2][100001],sol[2][100001],tt[100001];
int main()
{
  int i,st,dr,mij,max,f;
  fscanf(fin,"%d",&n);
  for(i=1;i<=n;i++)
    fscanf(fin,"%d",&s[i]);
  for(i=1;i<=n;i++)
    t[0][i]=inf;
  t[0][0]=0;t[1][0]=0;
  for(i=1;i<=n;i++)
  {
    st=0;dr=n;
    while(st<dr-1)
    {
      mij=(st+dr)/2;
      if(t[0][mij]<s[i]) st=mij;
      else dr=mij-1;
    }
    if(t[0][dr]<s[i])
    {
      sol[0][i]=dr+1;
      sol[1][i]=t[1][dr];
    }
    else
    {
      sol[0][i]=st+1;
      sol[1][i]=t[1][st];
    }
    if(t[0][sol[0][i]]>s[i])
    {
      t[0][sol[0][i]]=s[i];
      t[1][sol[0][i]]=i;
    }
  }
  max=0;
  for(i=1;i<=n;i++)
    if(sol[0][i]>max)
    {
      max=sol[0][i];
      f=i;
    }
  for(i=1;i<=max;i++)
  {
    tt[i]=f;
    f=sol[1][f];
  }
  fprintf(fout,"%d\n",max);
  for(i=max;i>=1;i--)
    fprintf(fout,"%d ",s[tt[i]]);
  fclose(fin);
  fclose(fout);
  return 0;
}