Cod sursa(job #2391898)

Utilizator alextodoranTodoran Alexandru Raul alextodoran Data 29 martie 2019 12:44:00
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>

#define N_MAX 100002

using namespace std;

int n;

struct elm
{
    int val, index;
};

bool operator < (elm a, elm b)
{
    return a.val < b.val;
}

elm e[N_MAX];

elm v[N_MAX];

int dp[N_MAX], pre[N_MAX];
pair <int, int> aib[N_MAX];

void upd (int pos, int val, int dpval)
{
    for(int i = val; i <= n; i += i&(-i))
        aib[i] = max(aib[i], make_pair(dpval, pos));
}

pair <int, int> qry (int val)
{
    pair <int, int> ans = make_pair(0, 0);
    for(int i = val; i >= 1; i -= i&(-i))
        ans = max(ans, aib[i]);
    return ans;
}

int ans[N_MAX];

int main()
{
    ifstream fin ("scmax.in");
    ofstream fout ("scmax.out");
    fin >> n;
    for(int i = 1; i <= n; i++)
    {
        fin >> e[i].val;
        e[i].index = i;
    }
    sort(e + 1, e + n + 1);
    int val = 0;
    for(int i = 1; i <= n; i++)
    {
        if(e[i].val > e[i - 1].val)
            val++;
        v[e[i].index] = elm{e[i].val, val};
    }
    int best = 0;
    for(int i = 1; i <= n; i++)
    {
        pair <int, int> p = qry(v[i].index - 1);
        dp[i] = p.first + 1;
        pre[i] = p.second;
        if(dp[i] > dp[best])
            best = i;
        upd(i, v[i].index, dp[i]);
    }
    fout << dp[best] << "\n";
    while(best > 0)
    {
        ans[++ans[0]] = best;
        best = pre[best];
    }
    for(int i = ans[0]; i >= 1; i--)
        fout << v[ans[i]].val << " ";
    fout << "\n";
    return 0;
}