Cod sursa(job #1803853)

Utilizator ancabdBadiu Anca ancabd Data 11 noiembrie 2016 22:39:36
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin ("scmax.in");
ofstream fout ("scmax.out");

#define MAX 100000
int l[MAX + 1], n, lmax, ind, rez[MAX + 1], sum, sumind, lind;

struct scmax
{
    int x, ind, l, bef;
}a[MAX + 1];

struct abc
{
    int a, ind;
}aib[MAX + 1];

bool cmp(scmax A, scmax B)
{
    if (A.x < B.x)return true;
    else if (A.x == B.x && A.ind < B.ind)return true;
    else return false;
}

void update (int x, int valind)
{
    for (int i = x; i <= n; i+= (i&-i))
        if (aib[i].a < a[valind].l)aib[i].a = a[valind].l, aib[i].ind = valind;
}

void query (int x)
{
    for (int i = x; i >= 1; i -= (i&-i))
        if (aib[i].a + 1 > sum)sum = aib[i].a + 1, sumind = aib[i].ind;
}

int main()
{
    fin >> n;
    for (int i = 1; i <= n; i++)fin >> a[i].x, a[i].ind = i;

    sort(a + 1, a + 1 + n, cmp);

    for (int i = 1; i <= n; i++)
    {
        if (a[i].x != a[i -1].x)
        {
            sum = 0;
            sumind = -1;

            query(a[i].ind);

            a[i].l = sum;
            a[i].bef = sumind;

            update(a[i].ind, i);

            if (a[i].l > lmax)lmax = a[i].l, lind = i;
        }
    }
    fout << lmax << '\n';
    while (a[lind].x > 0)
    {
        rez[++rez[0]] = a[lind].x;
        lind = a[lind].bef;
    }
    for (int i = rez[0]; i >= 1; i--)fout << rez[i] << ' ';
    return 0;
}