Cod sursa(job #1356840)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 23 februarie 2015 16:57:36
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
#include <algorithm>
#define NMAX 100023
#define inf 2000000023
FILE *fin, *fout;
int n, maxn, poz, dr = 0, p, ans[NMAX], p1;
struct ceva
{
    int val;
    int pos;
} v[NMAX], d[NMAX], temp;
bool comp(ceva a, ceva b)
{
    return (a.val <= b.val);
}
int main()
{
    fin = freopen("scmax.in", "r", stdin);
    fout = freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i<= n; ++i) scanf("%d", &v[i].val);
    for(int i = 0; i< n; ++i) d[i].val = inf;
    for(int i = 1; i<= n; i++)
    {
        poz = std::upper_bound(d, d+n, v[i], comp)-d;
        dr = poz+1;
        v[i].pos = poz+1;
        d[poz].pos = i;
        d[poz].val = v[i].val;
        if(poz+1 > maxn) maxn = poz+1;
    }
    v[0].pos = 0;v[0].val = 0;
    printf("%d\n", maxn);
    p = maxn;
    for(int i = n; i> 0; i--)
    {
        if(p == maxn && v[i].pos == p)
        {
            ans[p1] = v[i].val;
            p1++;
            p--;
            continue;
        }
        if(v[i].pos == p && v[i].val < v[i+1].val)
        {
            ans[p1] = v[i].val;
            p1++;
            p--;
            continue;
        }
    }
    for(int i = maxn-1; i>= 0; i--) printf("%d ", ans[i]);
    printf("\n");
    fclose(fin);
    fclose(fout);
    return 0;
}