Cod sursa(job #2722520)

Utilizator witekIani Ispas witek Data 12 martie 2021 22:22:08
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

int n;
vector <int> a, d, best, t;
int lenBest, pozMaxGlobal, maximGlobal;

void init() {
    a = d = best = t = vector <int> (n + 1);
}

void read() {
    f >> n;
    init();
    for(int i = 1; i <= n; ++i)
        f >> a[i];

}

void solve() {
    int st, dr, mid, ans;
    for(int i = 1; i <= n; ++i) {
        st = 1, dr = lenBest;
        ans = 0;
        while(st <= dr) {
            mid = (st + dr) / 2;
            if(a[best[mid]] > a[i])
                dr = mid - 1;
            else {
                if(a[best[mid]] < a[i])
                    ans = mid;
                st = mid + 1;

            }
        }
        d[i] = d[best[ans]] + 1;
        t[i] = best[ans];

        if(d[i] >= maximGlobal) {
            maximGlobal = d[i];
            pozMaxGlobal = i;
        }
        if(ans == lenBest)
            best[++lenBest] = i;
        else if(a[best[ans]] < a[i])
                best[ans + 1] = i;

    }
}

void print(int pos) {
    if(pos == 0)
        return;
    print(t[pos]);
    g << a[pos] << " ";
}

int main()
{
    read();
    solve();
    g << maximGlobal << "\n";
    print(pozMaxGlobal);
}