Nu aveti permisiuni pentru a descarca fisierul grader_test15.ok

Cod sursa(job #2221460)

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

#define NM 100002

using namespace std;

struct elem
{
    int val, ind;
};

int vmax[NM];
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));
}

void upd(int pos, int val, int vpos)
{
    for(int i = pos; i <= n; i += i ^ (i & (i - 1)))
        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 -= i ^ (i & (i - 1)))
        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, i1 = 1; i > 0; i = k[i], i1++)
        vmax[i1] = v1[i];
    for(int i = mx; i >= 1; i--)
        fout << vmax[i] << " ";
    return 0;
}