Mai intai trebuie sa te autentifici.

Cod sursa(job #2012521)

Utilizator mihai.alphamihai craciun mihai.alpha Data 18 august 2017 22:56:45
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <stdio.h>

FILE *fin, *fout;

const int MAX_N = 100000;

int v[MAX_N + 1], min[MAX_N + 1], p[MAX_N + 1];
int N;
int ans = 1, end = 1;

inline int find(int nr1)  {
    int r = 0, pas = 1 << 17;
    while(pas)  {
        if(r + pas <= ans && v[min[r + pas]] < nr1)
            r += pas;
        pas >>= 1;
    }
    return r;
}

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

int main()  {
    fin = fopen("scmax.in", "r");
    fout = fopen("scmax.out", "w");
    fscanf(fin, "%d", &N);
    for(int i = 1;i <= N;i++)
        fscanf(fin, "%d", &v[i]);
    min[1] = 1;
    for(int i = 2;i <= N;i++)  {
        int poz = find(v[i]);
        p[i] = min[poz];
        min[poz + 1] = i;
        if(ans < poz + 1)  {
            ans = poz + 1;
            end = i;
        }
    }
    fprintf(fout, "%d\n", ans);
    print(end);
    fclose(fin);
    fclose(fout);
    return 0;
}