Cod sursa(job #546590)

Utilizator mihaionlyMihai Jiplea mihaionly Data 5 martie 2011 10:05:55
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
using namespace std;
#define NMAX 1000001
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");
long long A[NMAX],sol[NMAX],L[NMAX],pre[NMAX],pL[NMAX];
int n,lmx;
void show(int i)
 {
 if(i==0) return;
 show(pre[i]);
 fprintf(g,"%d ",A[i]);
 }
int binary_search(int x)
 {
 int lb=1,ub=lmx,mb=(1+lmx)>>1,s=-1;
 while(lb<=ub)
  {
  if(L[mb]<x)
   {
   s=mb;
   lb=mb+1;
   }
  else
   {
   ub=mb-1;
   }
  mb=(ub+lb)>>1;
  }
 return s;
 }
int main()
 {
 int i,p;
 fscanf(f,"%d",&n);
 for(i=1;i<=n;i++)
  fscanf(f,"%lld",&A[i]);
 sol[1]=1;
 lmx=1;
 pL[1]=1;
 L[1]=A[1];
 for(i=2;i<=n;i++)
  {
  if(L[lmx]>=A[i]&&A[i]>A[pre[pL[lmx]]])
   {
   L[lmx]=A[i];
   pre[i]=pre[pL[lmx]];
   pL[lmx]=i;
   sol[i]=lmx;
   }
  else if(A[i]>L[lmx])
   {
   ++lmx;
   pre[i]=pL[lmx-1];
   sol[i]=lmx;
   L[lmx]=A[i];
   pL[lmx]=i;
   }
  else
   {
   p=binary_search(A[i]);
   if(p==-1)
    {
    pre[i]=0;
	sol[i]=1;
    }
   else
    {
	pre[i]=pL[p];
	sol[i]=p+1;
    }
   }
  }
 fprintf(g,"%d\n",lmx);
 show(pL[lmx]);
 return 0;
 }