Cod sursa(job #2867860)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 10 martie 2022 16:35:17
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <bits/stdc++.h>
#define x(i) (i&(-i))

using namespace std;

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

const int NMAX = 100005;
const int VALMAX = 2000000005;

int a[NMAX],b[NMAX],c[NMAX],pre[NMAX];
pair<int, int> aib[NMAX];
int dp[NMAX], previous[NMAX];
int n;

unordered_map<int, int> norm_map;
int rev_norm_map[NMAX];

void citire(){
    fin >> n;
    for(int i=1;i<=n;i++)
        fin >> a[i];
}

void normalizare(){
    for(int i=1;i<=n;i++)
        b[i] = a[i];
    sort(b+1, b+n+1);
    int curr = 0;
    for (int i = 1; i <= n; ++i) {
        if (!norm_map.count(b[i])) {
            norm_map[b[i]] = ++curr;
            rev_norm_map[curr] = b[i];
        }
    }
    for(int i=1;i<=n;i++)
        a[i]=norm_map[a[i]];

    // b = a;
    // sort(b.begin(), b.end());
    // b.erase(unique(b.begin(), b.end()), b.end());
    // for (int i = 1; i <= n; ++i)
    //     norm_map[b[i]] = i;
}

void update_aib(int poz, pair<int, int> val){
    for(int i=poz;i<=n;i+=x(i))
        aib[i]=max(aib[i],val);
    return;
}

pair<int, int> query_aib(int poz){
    pair<int, int> maxim(0, 0);
    for(int i=poz;i>=1;i-=x(i)){
        maxim=max(maxim,aib[i]);
    }
    return maxim;
}

void solve(){
    dp[1]=1;
    update_aib(a[1], make_pair(dp[1], 1));
    for(int i=2;i<=n;i++){
        pair<int, int> maxim = query_aib(a[i]-1);
        dp[i]=maxim.first + 1;
        previous[i] = maxim.second;
        update_aib(a[i], make_pair(dp[i], i));
    }
}

void afis(){
    int rasp=0,ind=0;
    for(int i=1;i<=n;i++){
        if(dp[i]>rasp){
            rasp=dp[i];
            ind=i;
        }
    }
    fout << rasp << '\n';

    vector<int> v;
    v.reserve(rasp);
    for (int i = ind; i; i = previous[i])
        v.push_back(i);
    reverse(v.begin(), v.end());
    for (int it : v)
        fout << rev_norm_map[a[it]] << " ";
}

int main()
{
    citire();
    normalizare();
    solve();
    afis();
    return 0;
}