Cod sursa(job #300244)

Utilizator alecmanAchim Ioan Alexandru alecman Data 7 aprilie 2009 12:21:51
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<cstdio>

using namespace std;

#define INPUT "scmax.in"
#define OUTPUT "scmax.out"

const long NMAX = 100001;

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

long N, poz;
long V[ NMAX ], Best[ NMAX ], Loc[ NMAX ], Poz[ NMAX ];

void readData()
{
  fscanf(fin, "%ld", &N);
  
  for(long i = 1; i <= N; ++i)
    fscanf(fin, "%ld", &V[ i ]);
    
  Best[ 1 ] = 1;
  Loc[ 1 ] = 1;
  Loc[ 0 ] = 0;
}

long binSrch(long Left, long Right, long Val)
{
  long mid = (Left + Right) >> 1;
  
  while(Left <= Right)
  {
    if(V[ Loc[ mid ] ] < Val && V[ Loc[ mid+1 ] ] >= Val) return mid;
    else
      if(V[ Loc[ mid+1 ] ] < Val) Left = mid + 1, mid = (Left + Right) >> 1;
    else
      Right = mid - 1, mid = (Left + Right) >> 1;
  }
  
  return poz;
}

void afis(long X)
{
  if(Poz[ X ] > 0) afis(Poz[ X ]);
  fprintf(fout, "%ld ", V[ X ]);
}

void solve()
{
  long nPoz;
  poz = 1;
  
  for(long i = 2; i <= N; ++i)
  {
    nPoz = binSrch(0, poz, V[ i ]);
    Poz[ i ] = Loc[ nPoz ];
    Best[ i ] = nPoz + 1;
    Loc[ nPoz + 1 ] = i;
    if(poz < nPoz + 1) poz = nPoz + 1;
  }
  
  long max = -1;
  poz = -1;
  
  for(long i = 1; i <= N; ++i)
    if(max < Best[ i ]) max = Best[ i ], poz = i;
    
  fprintf(fout, "%ld\n", max);
  
  afis(poz);
}

int main()
{
  readData();
  
  solve();
	
  fclose(fin);
  fclose(fout);
  
  return 0;
}