Cod sursa(job #886697)

Utilizator evodaniVasile Daniel evodani Data 23 februarie 2013 10:07:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>
#define NMAX 100001
using namespace std;
FILE *fin, *fout;
int n, a[NMAX], poz[NMAX], best[NMAX], b[NMAX], ct;
int caut (int p, int u, int val) {
    int m, bun, gasit=0;
    while (p<=u) {
        m=(p+u)/2;
        if (best[m]>=val) { u=m-1; bun=m; gasit=1; }
        else p=m+1;
    }
    if (gasit) return bun;
    return -1;
}
int main()
{
    int i, lgb=0, mmic;
    fin=fopen("scmax.in", "r"); fout=fopen("scmax.out", "w");
    fscanf (fin, "%d", &n); for (i=1; i<=n; ++i) {
        fscanf (fin, "%d", &a[i]);
        mmic=caut (1, lgb, a[i]);
        if (mmic==-1) { best[++lgb]=a[i]; poz[i]=lgb; }
        else { best[mmic]=a[i]; poz[i]=mmic; }
    }
    fprintf (fout, "%d\n", lgb);
    for (i=n; i>=1 && lgb; --i)
        if (poz[i]==lgb) {
            b[++ct]=a[i];
            --lgb;
        }
    for (i=ct; i>=1; --i) fprintf (fout, "%d ", b[i]); fprintf (fout, "\n");
    fclose(fin); fclose (fout);
    return 0;
}