Cod sursa(job #2712520)

Utilizator Ionut2791Voicila Ionut Marius Ionut2791 Data 25 februarie 2021 21:02:38
Problema Subsir crescator maximal Scor 45
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#define ll long long
#define sz(x) (int)(x).size()
#define debug(v,n) for (int i = 1; i <= (n); ++i) cout << v[i] << " ";
#define next cout << '\n'
#define LSB(a) ((-a) & a)
using namespace std;

const int N = 100005;
int n, AIB[N];
int v[N], atIdx[N];

void update(int pos, int val) {
    int idx = pos;
    while(pos <= n) {
        //cout << pos - LSB(pos) + 1 << " " << pos << '\n';
        AIB[pos] = max(AIB[pos], val);

        if(atIdx[AIB[pos]] == 0)
            atIdx[AIB[pos]] = v[idx];

        pos += LSB(pos);
    }
}

int check(int pos) {
    int maxDone = 0;
    while(pos > 0) {
        //cout << pos - LSB(pos) + 1 << " " << pos << " " << AIB[pos]<< '\n';
        maxDone = max(maxDone, AIB[pos]);
        pos -= LSB(pos);
    }
    return maxDone;
}

bool cmp(int a, int b) {
    if(v[a] == v[b])
        return a > b;
    return v[a] < v[b];
}

int main() {
    //ifstream fin("date.in.txt");
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    fin >> n;

    vector<int> pos;
    for (int i = 1; i <= n; ++i) {
        fin >> v[i];
        pos.push_back(i);
    }
    sort(pos.begin(), pos.end(), cmp);

    for (int x : pos) {
        int ad = check(x);
       // cout << v[x] << " " << ad<< "--\n";
        update(x, ad + 1);


      //  for (int i = 1; i <= n; ++i)
      //      cout << AIB[i] << " ";
      //  cout << '\n';
       // cout << '\n';
    }
    // cout << '\n';
    n = check(n);
    fout << n << "\n";

    for (int i = 1; i <= n; ++i)
        fout << atIdx[i] << " ";

    return 0;
}