Cod sursa(job #2369779)

Utilizator herbertoHerbert Mohanu herberto Data 6 martie 2019 09:13:32
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include<bits/stdc++.h>
#define MAXN 100001

int sol[MAXN], poz[MAXN], v[MAXN];
int solv[MAXN];
int cautbin(int st, int dr, int x){
  int mij, ans;
  ans=-1;
  while(st<=dr){
    mij=(st+dr)/2;
//    if(x==13)
//    printf("%d %d\n", mij, v[1]);
    if(sol[mij]>x){
      ans=mij;
      dr=mij-1;
    }
    else
      st=mij+1;
  }
  return ans;
}

int main(){
  FILE*fin=fopen("scmax.in", "r");
  FILE*fout=fopen("scmax.out", "w");
  int i, n, rez, pas, m, p, k;
  fscanf(fin, "%d", &n);
  for(i=1; i<=n; i++)
    fscanf(fin, "%d", &v[i]);
  m=0;
  for(i=1; i<=n; i++){
    if(m==0){
      m++;
      sol[m]=v[i];
      poz[i]=1;
    }
    else{
//      if(i==5)
//        for(k=1; k<=m; k++)
//          printf("%d ", sol[k]);
//      printf("%d %d %d\n", i, v[i], v[m]);
      if(v[i]>sol[m]){
        m++;
        sol[m]=v[i];
        poz[i]=m;
      }
      else{
        p=cautbin(1, m, v[i]);
//        if(v[i]==13)
//          printf("x%d %d", p, m);
        poz[i]=p;
        sol[p]=v[i];
      }
    }
  }
//  for(i=1; i<=n; i++)
//    printf("%d ", poz[i]);
  fprintf(fout, "%d\n", m);
  i=n;
  k=m;
  while(m>0 && i>0){
    if(poz[i]==m){
      solv[m]=v[i];
      m--;
    }
    i--;
  }
  for(i=1; i<=k; i++)
    fprintf(fout, "%d ", solv[i]);
  return 0;
}