Cod sursa(job #864351)

Utilizator vladvaldezVlad Dimulescu vladvaldez Data 24 ianuarie 2013 21:15:11
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <stdio.h>

using namespace std;
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");

int n,i,v[100001],s[100001],nr,b[100001],poz,maxi,o,h,l;
int caut(int x)
{
  int p,m,u,mx;

  mx=0;
  p=1;
  u=b[0];
  while (p<=u)
  {
    m=(p+u)/2;
    if(b[m]<x)
    {
       if(m>mx)mx=m;
       p=m+1;
    }
    else u=m-1;
  }
 return mx;
 }


int main()
{

 fscanf(f,"%d",&n);
 for(i=1;i<=n;i++)
 fscanf(f,"%d",&v[i]);
  b[1]=v[1];
  b[0]=1;

  for(i=2;i<=n;i++)
  {
   poz=caut(v[i]);
   if (poz==b[0])
   {
     b[0]++;
     b[poz+1]=v[i];
   }
   else b[poz+1]=v[i];
   s[i]=poz+1;
   }

  maxi=0;
  o=0;
  for(i=1;i<=n;i++)
    if (maxi<s[i]){maxi=s[i];o=i;}

 fprintf(g,"%d\n",maxi);
h=o;
l=0;
while(maxi>0)
{
l++;
b[l]=v[h];
maxi--;
while(s[h]!=maxi && h>0)h--;
}
for(i=l;i>=1;i--)
fprintf(g,"%d ",b[i]);
fclose(g);
return 0;
}