Cod sursa(job #3168239)

Utilizator AdrianRosuRosu Adrian Andrei AdrianRosu Data 11 noiembrie 2023 19:58:07
Problema Subsir crescator maximal Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include<bits/stdc++.h>
#define DIM 100001

using namespace std;

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

int dp[DIM], v[DIM];

int wmt[4 * DIM];

int n, i, answer, f;

map <int, vector <int>> mp;

map <int, bool> ok;

map <int, bool> :: iterator it;

unordered_map <int, int> nanswer, reverse_answer;

void solve(int pos){

    if(!mp[pos].size())
        return ;

    solve(pos - 1);

    fout << reverse_answer[v[mp[pos][mp[pos].size() - 1]]] << " ";

}

void Update(int node, int st, int dr, int a, int b){

    if(st == dr)
        wmt[node] = max(wmt[node], b);

    else {

        int mij = (st + dr) >> 1;

        if(a <= mij)
            Update(node << 1, st, mij, a, b);

        if(a > mij)
            Update(node << 1 | 1, mij + 1, dr ,a, b);

        wmt[node] = max(wmt[node << 1], wmt[node << 1 | 1]);
    }

}

int Query(int node, int st, int dr, int a, int b){

    if(dr < a || st > b)
        return 0;

    if(st >= a && dr <= b)
        return wmt[node];

    else {

        int mij = (st + dr) >> 1;

        int ok1 = Query(node << 1, st, mij, a, b);
        int ok2 = Query(node << 1 | 1, mij + 1, dr, a , b);

        return max(ok1, ok2);

    }


}

int main(){

    fin >> n;

    for(i=1;i<=n;i++){
        fin >> v[i];
        ok[v[i]] = 1;
    }

    for(it = ok.begin(); it != ok.end(); it++){

        nanswer[it -> first] = ++f;

        reverse_answer[f] = it -> first;

    }

    for(i=1;i<=n;i++)
        v[i] = nanswer[v[i]];

    for(i=1;i<=n;i++){

        if(v[i] - 1 >= 1)

            dp[i] = Query(1, 1, DIM, 1, v[i] - 1) + 1;

        else dp[i] = 1;

        Update(1, 1, DIM, v[i], dp[i]);

        mp[dp[i]].push_back(i);

    }

    for(i=1;i<=n;i++)
        if(dp[answer] < dp[i])
            answer = i;

    fout << dp[answer] << "\n";

    solve(dp[answer]);



}