Cod sursa(job #1783169)

Utilizator cella.florescuCella Florescu cella.florescu Data 18 octombrie 2016 20:33:58
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda cerculdeinfo-lectia3-programaredinamica1 Marime 0.81 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100001

FILE *fout;
int l[MAXN], prev[MAXN], v[MAXN];

void print(int poz){
  if(poz){
    print(prev[poz]);
    fprintf(fout, "%d ", v[poz]);
  }
}

int main()
{
    FILE *fin;
    int n, i, lmax, rasp, p;
    fin=fopen("scmax.in", "r");
    fscanf(fin, "%d", &n);
    for(i=1; i<=n; i++)
      fscanf(fin, "%d", &v[i]);
    fclose(fin);
    l[1]=lmax=1;
    for(i=2; i<=n; i++){
      p=1<<17; rasp=0;
      while(p){
        if(rasp+p<=lmax && v[l[rasp+p]]<v[i])
          rasp+=p;
        p>>=1;
      }
      if(rasp==lmax)
        ++lmax;
      prev[i]=l[rasp];
      l[rasp+1]=i;
    }
    fout=fopen("scmax.out", "w");
    fprintf(fout, "%d\n", lmax);
    print(l[lmax]);
    fprintf(fout, "\n");
    fclose(fout);
    return 0;
}