Cod sursa(job #1841232)

Utilizator crazylamaRiclea Andrei crazylama Data 5 ianuarie 2017 14:18:06
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.58 kb
#include <fstream>
#include <vector>
#include <cmath>
#include <utility>
using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

vector<int> v, l, poz;
/*vector< pair<int, int> > arbInt;*/

/*void build(int nod, int st, int dr)
{
    if (st == dr)
    {
        arbInt[nod].first = v[st];
        arbInt[nod].second = st;
        return;
    }
    int mij = st + (dr - st) / 2;
    build(nod << 1, st, mij);
    build((nod << 1) + 1, mij + 1, dr);
    if (arbInt[nod << 1].first > arbInt[(nod << 1) + 1].first)
        arbInt[nod] = arbInt[nod << 1];
    else
        arbInt[nod] = arbInt[(nod << 1) + 1];
}

pair<int, int> query(int nod, int st, int dr, int x, int y)
{
    if (st >= x && dr <= y)
        return arbInt[nod];
    int mij = st + (dr - st) / 2;
    if (y <= mij)
        return query(nod << 1, st, mij, x, y);
    else if (x > mij)
        return query((nod << 1) + 1, mij + 1, dr, x, y);
    pair<int, int> fHalf = query(nod << 1, st, mij, x, y);
    pair<int, int> sHalf = query((nod << 1) + 1, mij + 1, dr, x, y);
    if (fHalf.first > sHalf.first)
        return fHalf;
    return sHalf;
}

void scmax()
{
    int n = v.size() - 1;
    l[n] = 1;
    poz[n] = -1;
    build(1, 1, n);
    for (int i = n - 1; i >= 0; --i)
    {
        pair<int, int> x = query(1, 1, n, i + 1, n);
        if (x.first > v[i] && l[x.second] > l[i])
        {
            l[i] = l[x.second] + 1;
            poz[i] = x.second;
        }
        else
        {
            l[i] = 1;
            poz[i] = -1;
        }
    }
}*/

void scmax()
{
    int n = v.size() - 1;
    l[n] = 1;
    poz[n] = -1;
    for (int i = n - 1; i > 0; --i)
    {
        l[i] = 0;
        for (int j = i + 1; j <= n; ++j)
            if (v[i] < v[j] && l[j] > l[i])
            {
                l[i] = l[j] + 1;
                poz[i] = j;
            }
        if (l[i] == 0)
        {
            l[i] = 1;
            poz[i] = -1;
        }
    }
}

int main()
{
    int n;
    f >> n;
    l.resize(n + 1);
    poz.resize(n + 1);
    v.resize(n + 1);
    //arbInt.resize(4 * n + 1);
    for (int i = 1; i <= n; ++i)
        f >> v[i];
    scmax();
    /*for (int i = 1; i <= arbInt.size(); ++i)
        g << arbInt[i].first << " ";*/
    int lg = 0, poz_max = -1;
    for (int i = 0; i < n; ++i)
        if (l[i] > lg)
        {
            poz_max = i;
            lg = l[i];
        }
    g << lg << "\n";
    while(poz_max != -1)
    {
        g << v[poz_max] << " ";
        poz_max = poz[poz_max];
    }
    return 0;
}