Cod sursa(job #883064)

Utilizator stefan.cStefan Cucea stefan.c Data 19 februarie 2013 18:24:32
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>
#define MAXN 1000001
using namespace std;
int poz[MAXN], v[MAXN], elem[MAXN], sol[MAXN], reconst[MAXN];

int cautbinar(int st,int dr,int x){
   int m,lungime;
   while(st<=dr)
       {
           m=(st+dr)/2;
           if(elem[m]<x)
              { lungime=m;
                st=m+1;
              }
           else
              {
                  dr=m-1;
              }
       }
 return lungime;
}

int main()
{int i,n,lungime,maxim;
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
   scanf("%d",&v[i]);
elem[0]=-2000000000;
lungime=0;
for(i=1;i<=n;i++)
   { maxim=cautbinar(0,lungime,v[i]);
     elem[maxim+1]=v[i];
       if(maxim+1>lungime)
           lungime=maxim+1;
     poz[maxim+1]=i;
     sol[i]=poz[maxim];
   }
printf("%d\n",lungime);
reconst[lungime]=elem[lungime];
int x;
x=poz[lungime];
for(i=lungime-1;i>=1;i--)
   { x=sol[x];
     reconst[i]=v[x];
   }
for(i=1;i<=lungime;i++)
    printf("%d ",reconst[i]);
return 0;
}