Cod sursa(job #2391892)

Utilizator alextodoranTodoran Alexandru Raul alextodoran Data 29 martie 2019 12:40:54
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 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;
}

vector <int> ans;

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.push_back(best);
        best = pre[best];
    }
    reverse(ans.begin(), ans.end());
    for(auto i : ans)
        fout << v[i].val << " ";
    fout << "\n";
    return 0;
}