Cod sursa(job #1569436)

Utilizator Alex.PAlexandru Pacurar Alex.P Data 15 ianuarie 2016 15:58:48
Problema Subsir crescator maximal Scor 20
Compilator c Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#include <stdlib.h>

int v[100000];
int q[100000];
int p[100000];

int main()
{
    FILE *fin, *fout;
    int n,i,st,dr,mij,l,max;
    fin=fopen("scmax.in","r");
    fout=fopen("scmax.out","w");
    fscanf(fin,"%d",&n);
    for(i=0;i<n;i++){
      fscanf(fin,"%d",&v[i]);
    }
    p[0]=1;
    q[0]=0;
    l=max=1;
    for(i=1;i<n;i++){
      if(v[i]>v[q[l-1]]){
        q[l]=i;
        p[i]=p[q[l-1]]+1;
        l++;
        if(l>max){
          max=l;
        }
      }
      else{
        st=0;
        dr=l-1;
        while(st<dr){
          mij=(st+dr)/2;
          if(v[q[mij]]<v[i])
            st=mij+1;
          else
            dr=mij;
        }
        q[st]=i;
        if(st==0)
          p[i]=1;
        else
          p[i]=p[q[st-1]]+1;
        l=st+1;
      }
    }
    fprintf(fout,"%d\n",max);
    n--;
    l=max;
    i=0;
    for(i=0;i<max;){
      if(p[n]==l){
        q[i]=n;
        i++;
        l--;
      }
      n--;
    }
    i--;
    for(i;i>=0;i--){
      fprintf(fout,"%d ",v[q[i]]);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}