Cod sursa(job #1984617)

Utilizator Arsene_DenisaArsene Denisa Arsene_Denisa Data 25 mai 2017 15:32:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include<stdio.h>

int v[100001], sol[100001], poz[100001], vc[100001], r[100001];

using namespace std;

int main() {
     FILE *fin, *fout;
     int n, i, pozz, j, m, nr, ct, max, x, elem, rr;

     fin=fopen("scmax.in", "r");
     fout=fopen("scmax.out", "w");
     fscanf( fin, "%d", &n);
     for(i=1;i<=n;i++) {
        fscanf( fin, "%d", &v[i]);
     }
     sol[1]=v[1];
     nr=1;
     poz[1]=1;
     for(x=1;x<=n;x++) {
        if(v[x]>sol[nr]) {
            nr++;
            poz[x]=nr;
            sol[nr]=v[x];
        }
        else {
        i=1;
        j=nr;
        ct=1;
        while(i<=j) {
            m=(i+j)/2;
          if(sol[m]>=v[x]) {
              j=m-1;
              ct=m;
          }
          else {
              i=m+1;
          }
        }
        sol[ct]=v[x];
        poz[x]=ct;
        }
     }
     max=0;
     for(i=1;i<=n;i++) {
        if(poz[i]>max) {
          max=poz[i];
        }
     }
     fprintf( fout, "%d\n", max);
     elem=max;
     rr=max;
     for(i=n;i>=1;i--) {
        if(vc[poz[i]]==0 && poz[i]==elem) {
            vc[poz[i]]++;
        r[rr]=v[i];
        rr--;
        elem--;
        }
     }
     for(i=1;i<=max;i++) {
        fprintf( fout, "%d ", r[i]);
     }
     fclose( fin );
     fclose( fout );

    return 0;
}