Cod sursa(job #2696456)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 15 ianuarie 2021 21:45:30
Problema Subsir crescator maximal Scor 10
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#include <stdlib.h>

int v[100000],s[100000],r[100000];

int cautbin(int x, int e){
  int b,m;
  b=0;
  while(b<e-1){
    m=(b+e)/2;
    if(v[s[m]]>x)
      e=m;
    else
      b=m;
  }
  return b;
}

int corect(int j){
  int i=1;
  while(i<j && s[i]>s[i-1])
    i++;
  if(i==j)
    return 1;
  else
    return 0;
}

int main(){
  int n,i,j,max,k;
  FILE *fin, *fout;

  fin=fopen("scmax.in","r");
  fscanf(fin,"%d",&n);
  for(i=0;i<n;i++)
    fscanf(fin,"%d",&v[i]);
  fclose(fin);

  j=1;
  s[0]=0;
  max=1;
  for(i=1;i<n;i++){
    if(v[i]>v[s[j-1]]){
      s[j]=i;
      j++;
    } else{
      if(max<j && corect(j)==1){
        max=j;
        for(k=0;k<j;k++){
          r[k]=v[s[k]];
        }
      }
      s[cautbin(v[i],j)]=i;
    }
  }

  if(max<j && corect(j)==1){
    max=j;
    for(i=0;i<j;i++){
      r[i]=v[s[i]];
    }
  }

  fout=fopen("scmax.out","w");
  fprintf(fout,"%d\n",max);
  for(i=0;i<max;i++){
    fprintf(fout,"%d ",r[i]);
  }
  fclose(fout);
  return 0;
}