Cod sursa(job #600108)

Utilizator Smaug-Andrei C. Smaug- Data 30 iunie 2011 16:24:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define MAXN 100005

int T[MAXN], A[MAXN], P[MAXN], IND[MAXN], B[MAXN], L[MAXN], N;

void Update(int x, int ind){

  for( ; x<=N; x+=x^(x-1) & x)
    if(L[ind] > L[T[x]])
      T[x]=ind;
      
}
  
int Query(int x){

  int r=0;

  for( ; x; x-=x^(x-1) & x)
    if(L[r] < L[T[x]])
      r=T[x];
  
  return r;

}

int main(){

  freopen("scmax.in", "r", stdin);
  freopen("scmax.out", "w", stdout);

  int i, cnt, maxp;

  scanf("%d", &N);
  for(i=1; i<=N; i++){
    scanf("%d", A+i);
    IND[i]=A[i];
  }

  sort(IND+1, IND+N+1);

  cnt=1;
  for(i=2; i<=N; i++)
    if(IND[i] != IND[cnt])
      IND[++cnt]=IND[i];

  for(i=1; i<=N; i++)
    B[i]=lower_bound(IND+1, IND+cnt+1, A[i])-IND;

  memset(T, 0, sizeof(T));

  L[0]=0;
  for(i=1; i<=N; i++){
    P[i]=Query(B[i]-1);
    L[i]=L[P[i]]+1;
    Update(B[i], i);
  }

  maxp=0;
  for(i=1; i<=N; i++)
    if(L[maxp] < L[i])
      maxp=i;

  printf("%d\n", L[maxp]);
  for(cnt=0, i=maxp; i; i=P[i])
    IND[++cnt]=A[i];

  for(i=cnt; i; i--)
    printf("%d ", IND[i]);
  printf("\n");

  return 0;

}