Cod sursa(job #1781691)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 17 octombrie 2016 11:20:59
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <stdio.h>
int v[100001], u[100001], ord[100001], PUTERE;
int out[100001];
FILE *fi, *fo;

inline int CB(int x){
  int pas=PUTERE, rez=0;
  for(pas/=2;pas>0;pas/=2)
    if(v[rez+pas]!=0 && x>u[v[rez+pas]])
      rez+=pas;
  return rez;
}

int main()
{
  int n, i, poz, max=0;
  fi=fopen("scmax.in", "r");
  fo=fopen("scmax.out", "w");
  fscanf(fi, "%d", &n);
  PUTERE=1;
  while(PUTERE<n)
    PUTERE*=2;
  for(i=1;i<=n;i++)
    fscanf(fi, "%d", &u[i]);
  for(i=1;i<=n;i++){
    poz=CB(u[i]);
    v[poz+1]=i;
    ord[i]=v[poz];
    if(poz+1>max)
      max=poz+1;
  }
  fprintf(fo, "%d\n", max);
  i=v[max];
  poz=0;
  do{
    out[poz++]=u[i];
    i=ord[i];
  }while(i!=0);
  for(poz--;poz>=0;poz--){
    fprintf(fo, "%d ", out[poz]);
  }
  fclose(fi);
  fclose(fo);
  return 0;
}