Mai intai trebuie sa te autentifici.

Cod sursa(job #3144409)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 7 august 2023 22:03:58
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.18 kb
#include <fstream>
#include<iostream>
#include <vector>
#include <algorithm>
#define NMAX 100002
std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");
std::vector<std::pair<int, int>> V;
std::vector<std::pair<int, int>> tree;
int pred[NMAX];
std::pair<int, int> unite(std::pair<int, int> a, std::pair<int, int> b){
    if(a.first > b.first)
        return a;
    else return b;
}
void update(int node, int left, int right, int pos, int i, int value){
    if(left == right){
        tree[node] = {value, i};
        return ;    
    }
    int mid = left + (right - left) / 2;
    if(pos <= mid){
        update(2 * node, left, mid, pos, i, value);
    }
    else{
        update(2 * node + 1, mid + 1, right, pos, i, value);
    }
    tree[node] = unite(tree[node * 2], tree[node * 2 + 1]);
}
std::pair<int, int> query(int node, int left, int right, int L, int R){
    if(L <= left && right <= R){
        return tree[node];
    }
    if(L > right || R < left)
        return {0, 0};
    int mid = left + (right - left)/2;
    
    return unite(
        query(node * 2, left, mid, L, R), 
        query(node * 2 + 1, mid + 1, right, L, R)
    );
}
int main(){
    int n; 
    fin >> n;
    V = std::vector<std::pair<int, int>> (n + 1);
    std::vector<int> arr(n + 1), u(n + 1), result;
    tree.resize(4 * n);
    for(int x, i = 1; i <= n; i ++){
        fin >> x;
        V[i].first = x;
        V[i].second = i;
        u[i] = x;
    }

    std::sort(V.begin(), V.end());
    int x = 0;

    for(int i = 1; i <= n; i++){
        if(i == 1 || V[i].first != V[i-1].first)
            arr[V[i].second] = ++x;
        else arr[V[i].second] = x;
    }
    /*for(int i = 1; i <= n; i++)
        std::cout << arr[i] << " ";
    std::cout << "\n";
    */
    for(int i = 1; i <= n; i++){
        std::pair<int, int> Q = query(1, 1, n, 1, arr[i] - 1);
        update(1, 1, n, arr[i], i, Q.first + 1);
        //std::cout << Q.first << " " << Q.second << "\n";
        pred[i] = Q.second;
    }
    fout << tree[1].first << "\n";
    int j = tree[1].second;
    while(j != 0){
        result.push_back(u[j]);
        j = pred[j];
    }
    for(int i = result.size() - 1; i >= 0; i --){
        fout << result[i] << " ";
    }
}