Cod sursa(job #2696639)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 16 ianuarie 2021 11:25:07
Problema Subsir crescator maximal Scor 60
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <stdio.h>
#include <stdlib.h>

int v[100000],s[100000],pred[100000];
FILE *fin, *fout;

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

int printSir(int i){
  if(pred[i]==-1)
    fprintf(fout,"%d ",v[i]);
  else{
    printSir(pred[i]);
    fprintf(fout,"%d ",v[i]);
  }
}
int main(){
  int n,i,max,k,pos;

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

  max=1;
  pred[0]=-1;
  for(i=1;i<n;i++){
    pos=cautbin(v[i],max+1);
    s[pos]=i;
    if(pos==0)
      pred[i]=-1;
    else
      pred[i]=s[pos-1];
    if(pos>max)
      max=pos;
  }

  fout=fopen("scmax.out","w");
  fprintf(fout,"%d\n",max+1);
  printSir(s[max]);
  fclose(fout);
  return 0;
}