Cod sursa(job #3312900)

Utilizator petric_mariaPetric Maria petric_maria Data 30 septembrie 2025 18:14:08
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");

int n, a[100005], dp[100005], ant[100005], ans = 0, poz;
vector <int> v;

int cauta (int x) {
    int st = 0, dr = v.size() - 1, mij, p = -1;
    while (st <= dr) {
        mij = (st + dr)/2;
        if (a[v[mij]] >= x) {
            p = mij;
            dr = mij - 1;
        }
        else st = mij + 1;
    }
    return p;
}

void drum (int p) {
    if (p == 0)
        return;
    drum (ant[p]);
    g << a[p] << ' ';
}

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

    v.push_back (1);
    dp[1] = 1;  ant[1] = 0;
    for (int i=2; i<=n; ++i) {
        int p = cauta (a[i]);
        if (p == -1) {
            v.push_back (i);
            dp[i] = v.size();
            ant[i] = v[ v.size()-2 ];

            if (dp[i] > ans) {
                ans = dp[i];  poz = i;
            }
        }
        else {
            v[p] = i;
            dp[i] = p+1;
            if(p == 0)
                ant[i] = 0;
            else
                ant[i] = v[p-1];
            if (dp[i] > ans) {
                ans = dp[i];  poz = i;
            }
        }
    }
    g << ans << '\n';
    drum (poz);

    return 0;
}