Cod sursa(job #1984626)

Utilizator mirceagavrizimircea luca gavrizi mirceagavrizi Data 25 mai 2017 15:52:12
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
int v[100001],sol[100001],poz[100001],d[100001];
#include<stdio.h>
using namespace std;
int main(){
  freopen("scmax.in","r",stdin);
  freopen("scmax.out","w",stdout);
  int n,i,k,nr,p1,p2,m,cm,maxx,j;
  scanf("%d",&n);
  for(i=1;i<=n;i++)
    scanf("%d",&v[i]);
  sol[1]=v[1];
  poz[1]=1;
  k=1;
  for(i=2;i<=n;i++){
      nr=v[i];
      if(nr>sol[k]){
          sol[k+1]=nr;
          k++;
          poz[i]=k;
      }
      else{
          p1=1;
          p2=k;
          while(p1<=p2){
              m=(p1+p2)/2;
              if(sol[m]<nr){
                  p1=m+1;
              }
              else{
                  p2=m-1;
                  cm=m;
              }
          }
          sol[cm]=nr;
          poz[i]=cm;
      }
  }
  maxx=-1;
  for(i=n;i>=1;i--){
      if(poz[i]>maxx){
          maxx=poz[i];
          cm=i;
      }
  }
  printf("%d\n",maxx);
  nr=maxx;
  k=1;
  for(i=n;i>=1;i--){
      if(poz[i]==nr){
          d[k]=v[i];
          k++;
          nr--;
      }
  }
  for(i=k-1;i>=1;i--)
      printf("%d ",d[i]);
return 0;
}