Cod sursa(job #3168233)

Utilizator AdrianRosuRosu Adrian Andrei AdrianRosu Data 11 noiembrie 2023 19:54:08
Problema Subsir crescator maximal Scor 25
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 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;

map <int, vector <int>> mp;

void solve(int pos){

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

    solve(pos - 1);

    fout << 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];

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

        dp[i] = Query(1, 1, DIM, 1, v[i] - 1) + 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]);



}