Cod sursa(job #2971158)

Utilizator DooMeDCristian Alexutan DooMeD Data 26 ianuarie 2023 19:04:18
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;

inline int lsb(int x) {
    return x & (-x);
}

int n;

int len[nmax+5], ind[nmax+5];
int v[nmax+5];

int mx[nmax+5], prv[nmax+5];

pair<int, int> query(int pos) {
    pair<int, int> temp = {0, 0};
    for(int i=pos; i>=1; i-=lsb(i))
        if(len[i] > temp.first) {
            temp.first = len[i];
            temp.second = ind[i];
        }
    return temp;
}

void update(int pos, int val, int w) {
    for(int i=pos; i<=n; i+=lsb(i))
        if(val > len[i]) {
            len[i] = val;
            ind[i] = w;
        }
}

int main() {
    ifstream f("scmax.in");
    ofstream g("scmax.out");

    f >> n;
    vector<int> vals;
    for(int i=1; i<=n; i++) {
        f >> v[i];
        vals.emplace_back(v[i]);
    }
    sort(vals.begin(), vals.end());
    vals.erase(unique(vals.begin(), vals.end()), vals.end());

    int ans = -1, pos;
    for(int i=1; i<=n; i++) {
        int norm = lower_bound(vals.begin(), vals.end(), v[i]) - vals.begin() + 1;        
        auto temp = query(norm-1);
        mx[i] = temp.first + 1;
        prv[i] = temp.second;
        update(norm, mx[i], i);
        if(mx[i] > ans) {
            ans = mx[i];
            pos = i;
        }
    }
    vector<int> scmax;
    while(pos != 0) {
        scmax.emplace_back(v[pos]);
        pos = prv[pos];
    }
    reverse(scmax.begin(), scmax.end());
    g << scmax.size() << "\n";
    for(auto i : scmax) g << i << " ";
    return 0;
}