Cod sursa(job #3265358)

Utilizator vladm98Munteanu Vlad vladm98 Data 29 decembrie 2024 18:29:49
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("scmax.in");
ofstream fout ("scmax.out");

int v[100005],cv[100005];
map <int,int> Nrm;
int iNrm[100005];
int tata[100005];
vector <int> ans;

pair <int,int> aint[4*100005];

void update(int node, int left, int right, int poz, pair <int,int> value) {
    if (left == right) {
        aint[node] = value;
        return;
    }
    int mid = (left + right) / 2;

    if (poz <= mid) {
        update(node * 2, left, mid, poz, value);
    } else {
        update(node * 2 + 1, mid + 1, right, poz, value);
    }

    aint[node] = max(aint[node * 2],aint[node * 2 + 1]);
}

pair <int,int> query(int node, int left, int right, int a, int b) {
    if (a <= left && right <= b) {
        return aint[node];
    }
    int mid = (left + right) / 2;
    pair <int,int> leftMax = {0,0}, rightMax = {0,0};

    if (a <= mid) {
        leftMax = query(node * 2, left, mid, a, b);
    }

    if (mid + 1 <= b) {
        rightMax = query(node * 2 + 1, mid + 1, right, a, b);
    }

    return max(leftMax,rightMax);
}

int main()
{
    int n;
    fin >> n;
    for (int i=1;i<=n;++i){
        fin >> v[i];
        cv[i] = v[i];
    }
    sort(cv,cv+n+1);
    int Init = 0;
    for (int i=1;i<=n;++i){
        tata[i] = 0;
        if (Nrm[cv[i]]>0) continue;
        Init++;
        Nrm[cv[i]] = Init;
        iNrm[Init] = cv[i];
    }
    int Size = 0;
    int Cmme = 0; // Cel mai mare element
    for (int i=1;i<=n;++i){
        pair <int,int> loc = {0,0};
        if (Nrm[v[i]]==1){
            update(1,1,n,1,{1,i});
            continue;
        }
        loc = query(1,1,n,1,Nrm[v[i]]-1);
        int frs = loc.first+1;
        update(1,1,n,Nrm[v[i]],{frs,i});
        tata[i] = loc.second;
        if (Size<frs){
            Size = frs;
            Cmme = i;
        }
    }
    int x = Cmme;
    ans.push_back(x);
    while (tata[x]!=0){
        x = tata[x];
        ans.push_back(x);
    }
    fout << Size << '\n';
    for (int i=ans.size()-1;i>=0;--i) fout << v[ans[i]] << ' ';
    return 0;
}