Cod sursa(job #543629)

Utilizator rusu_raduRusu Radu rusu_radu Data 28 februarie 2011 13:25:14
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <cassert>
#define Nmax 100005
#define InFile "scmax.in"
#define OutFile "scmax.out"

using namespace std;

int n, q, lg, w;
int Q[Nmax], P[Nmax], T[Nmax], sl[Nmax];

void read();
void solve();
int place (int st, int dr, int val);
void write();

int main()
{
  assert (freopen (InFile, "r", stdin));
  assert (freopen (OutFile, "w", stdout));
  read();
  solve();
  write();
  return 0;
}

void read()
{
  int i;
  scanf ("%d\n", &n);
  for (i=1; i<=n; i++)
    scanf ("%d ", &T[i]);
}

void solve ()
{
  int i, pas;
  //first step
  q=0;
  for (i=1; i<=n; i++)
  {
    P[i]=place (1, q, T[i]);
    Q[P[i]]=T[i];
    if (P[i]==q+1) q++;
  }
  //second step
  lg=q; pas=q; w=1;
  for (i=n; i>0; i--)
    if (P[i]==pas && pas!=0)
    {
      pas--;
      sl[w++]=T[i];
    }
  
}

int place (int st, int dr, int val)
{
  int mij, p=dr+1;
  while (st<=dr)
  {
    mij=st+(dr-st)/2;
    if (Q[mij]>=val)
    {
      p=mij;
      dr=mij-1;
    }
    else
      st=mij+1;
    
  }
  return p;
}

void write()
{
  int i;
  printf ("%d\n", lg);
  for (i=w-1; i>0; i--)
    printf ("%d ", sl[i]);
  printf ("\n");
}