Cod sursa(job #2221456)

Utilizator alextodoranTodoran Alexandru Raul alextodoran Data 14 iulie 2018 13:18:36
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

#define NM 100002

using namespace std;

struct elem
{
    int val, ind;
};

vector <int> vmax;
int n, v[NM], k[NM], mx, mxpos, v1[NM];
pair <int, int> aib[NM];
elem vn[NM];

bool fs(elem a, elem b)
{
    return (a.val < b.val || (a.val == b.val && a.ind < b.ind));
}

int lsb(int val)
{
    return val ^ (val & (val - 1));
}

void upd(int pos, int val, int vpos)
{
    for(int i = pos; i <= n; i += lsb(i))
        if(make_pair(val, vpos) > aib[i])
            aib[i] = make_pair(val, vpos);
}

pair <int, int> qry(int pos)
{
    pair <int, int> ans = make_pair(0, 0);
    for(int i = pos - 1; i >= 1; i -= lsb(i))
        if(aib[i] > ans)
            ans = aib[i];
    return ans;
}

int main()
{
    ifstream fin ("scmax.in");
    ofstream fout ("scmax.out");
    fin >> n;
    for(int i = 1; i <= n; i++)
    {
        fin >> vn[i].val;
        v1[i] = vn[i].val;
        vn[i].ind = i;
    }
    sort(vn + 1, vn + n + 1, fs);
    for(int i = 1, nr = 0; i <= n; i++)
    {
        if(i == 1 || vn[i].val > vn[i - 1].val)
            nr++;
        v[vn[i].ind] = nr;
    }
    for(int i = 1; i <= n; i++)
    {
        pair <int, int> mx1 = qry(v[i]);
        int dp = mx1.first + 1;
        upd(v[i], dp, i);
        k[i] = mx1.second;
        if(dp > mx)
        {
            mx = dp;
            mxpos = i;
        }
    }
    fout << mx << "\n";
    for(int i = mxpos; i > 0; i = k[i])
        vmax.push_back(v1[i]);
    for(int i = mx - 1; i >= 0; i--)
        fout << vmax[i] << " ";
    return 0;
}