Cod sursa(job #2400654)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 8 aprilie 2019 23:16:45
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include <iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int v[N];
int len[N];
int fost[N];
int cur;
int cb(int val){
  int pas=0,p2=1<<16;
  while(p2){
    if(pas+p2<=cur && v[len[pas+p2]]<val)
      pas+=p2;
    p2/=2;
  }
  return pas+1;
}
FILE*fin,*fout;
void afis(int poz){
  if(fost[poz]>0){
    afis(fost[poz]);
  }
  fprintf(fout,"%d ",v[poz]);
}
int main()
{
    fin=fopen("scmax.in","r");
    fout=fopen("scmax.out","w");
    int n;
    fscanf(fin,"%d",&n);
    for(int i=1;i<=n;i++){
      fscanf(fin,"%d",&v[i]);
    }
    len[1]=1;
    cur=1;
    for(int i=2;i<=n;i++){
      if(v[i]>v[len[cur]]){
        fost[i]=len[cur];
        cur++;
        len[cur]=i;
      }
      else{
        int poz=cb(v[i]);
        fost[i]=len[poz-1];
        len[poz]=i;
      }
    }
    fprintf(fout,"%d\n",cur);
    afis(len[cur]);
    return 0;
}