Cod sursa(job #1956769)

Utilizator mihai.alphamihai craciun mihai.alpha Data 7 aprilie 2017 00:45:47
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdio.h>

FILE *fin = fopen("scmax.in", "r"), *fout = fopen("scmax.out", "w");

#define MAX_N 100000

int v[MAX_N + 1], aux[MAX_N + 1], poz[MAX_N + 1], sol[MAX_N + 1];
int n;

int main()  {
    fscanf(fin, "%d", &n);
    int k = 0;
    for(int i = 1;i <= n;i++)  {
        fscanf(fin, "%d", &v[i]);
        int st, dr;
        st = 0, dr = k;
        while(st < dr)  {
            int mij = (st + dr) / 2;
            if(aux[mij] == v[i])
                st = dr = mij;
            else if(aux[mij] < v[i])
                st = mij + 1;
            else if(aux[mij] > v[i])
                dr = mij;
        }
        int mij = (st + dr) / 2;
        if(st == k && v[i] >= aux[k])
            k++;
        aux[mij] = v[i];
        poz[i] = mij;
    }
    fprintf(fout, "%d\n", k);
    int j = k - 1;
    for(int i = n;i >= 1;i--)  {
        if(poz[i] == j)
            sol[j] = i, j--;
    }
    for(int i = 0;i < k;i++)
        fprintf(fout, "%d ", v[sol[i]]);
    fclose(fin);
    fclose(fout);
    return 0;
}