Cod sursa(job #1314561)

Utilizator vladvaldezVlad Dimulescu vladvaldez Data 11 ianuarie 2015 23:16:53
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <stdio.h>

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

int A[100005],p[100005],l[100005],best[100005],n,nr,i,poz,mx;


void drum (int i)
{
if (p[i]>0)drum(p[i]);
fprintf(g,"%d ",A[i]);

}

int caut (int x)
{
int p,u,m,r;
p=0;u=nr;m=(p+u)/2;
while(p<=u)
{
  if (x<=A[l[m]]){u=m-1;m=(p+u)/2;}
  else if (x>A[l[m]]){r=m;p=m+1;m=(p+u)/2;}
}
return r;
}


int main()
{
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)fscanf(f,"%d",&A[i]);
l[0]=0;
l[1]=1;
best[1]=1;
for(i=2;i<=n;i++)
{
poz=caut(A[i]);
p[i]=l[poz];
//sau best[poz]
best[i]=poz+1;
l[poz+1]=i;
if (nr<poz+1)nr=poz+1;
}
mx=0;
for(i=1;i<=n;i++)
if (mx<best[i]){mx=best[i];poz=i;}

fprintf(g,"%d\n",mx);
drum(poz);

fclose(g);
return 0;
}