Cod sursa(job #1726699)

Utilizator leopop29Pop Leonard leopop29 Data 8 iulie 2016 18:58:49
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define NM 100000
#define a first
#define b second
#define mp make_pair

using namespace std;

vector<pair<int, int>> v, ai;
int n, p[NM], reconst[NM], ov[NM];

void update(int l, int r, int t, int c, int x, int pz)
{
    if(l > r || t < l || t > r)
        return;

    if(l == r)
        ai[c] = mp(x, pz);
    else
    {
        int md = (l+r)/2, nx = c*2;
        update(l, md, t, nx, x, pz);
        update(md+1, r, t, nx+1, x, pz);

        if(ai[nx].a > ai[nx+1].a)
            ai[c] = ai[nx];
        else
            ai[c] = ai[nx+1];
    }
}

pair<int, int> query(int l, int r, int tl, int tr, int c)
{
    if(tl > r || tr < l)
        return mp(0, 0);

    if(l >= tl && r <= tr)
        return ai[c];
    else
    {
        pair<int, int> x, y;
        int md = (l+r)/2, nx = c*2;

        x = query(l, md, tl, tr, nx);
        y = query(md+1, r, tl, tr, nx+1);

        if(x.a > y.a)
            return x;
        else
            return y;
    }
}

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

    f >> n;
    v.resize(n);
    ai.resize(n*4);

    for(int i = 0; i < n; ++i)
        f >> v[i].a, v[i].b = -i,
        ov[i] = v[i].a;

    sort(v.begin(), v.end());

    int mx = 0, mxp;
    for(int i = 0; i < n; ++i)
    {
        pair<int, int> x = query(0, n-1, 0, -v[i].b, 1);
        ++x.a;

        update(0, n-1, -v[i].b, 1, x.a, -v[i].b);
        p[-v[i].b] = x.b;
        if(mx < x.a)
        {
            mx = x.a;
            mxp = -v[i].b;
        }
    }

    g << mx << '\n';
    for(int i = 1, cp = mxp; i <= mx; ++i, cp = p[cp])
        reconst[i] = cp;
    for(int i = mx; i; --i)
        g << ov[reconst[i]] << ' ';
}