Cod sursa(job #3213829)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 13 martie 2024 15:05:28
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.23 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
using pii = pair<int,int>;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int nmax = 1e5 + 9;
int v[nmax] , dp[nmax] , p[nmax] , n , og[nmax];
pii aint[4*nmax];
void update(int nod , int st , int dr , int &val , int &acc, int &poz)
{
    if(st == dr)
    {
        aint[nod] = {val,poz};
    }
    else
    {
        int mij = st + (dr-st)/2;
        if(acc <= mij) update(nod*2,st,mij,val,acc,poz);
        else update(nod*2+1,mij+1,dr,val,acc,poz);
        if(aint[nod*2].first > aint[nod*2+1].first)
        {
            aint[nod] = aint[nod*2];
        }
        else aint[nod] = aint[nod*2+1];
    }
}
pii query(int nod , int st , int dr , int &qdr)
{
    if(dr <= qdr)
    {
        return aint[nod];
    }
    else
    {
        int mij = st + (dr-st)/2;
        pii val = query(nod*2,st,mij,qdr);
        if(mij < qdr)
        {
            pii asta = query(nod*2+1,mij+1,dr,qdr);
            if(val.first > asta.first);
            else val = asta;
        }
        return val;
    }
}
void rec(int x)
{
    if(x == 0) return;
    rec(p[x]);
    cout << og[x] << ' ';
}
signed main()
{
    cin >> n;
    for(int i = 1; i <= n ; ++i) cin >> v[i];
    for(int i = 1 ;i <= n ;++i) og[i] = v[i];
    vector <pii> norm;
    for(int i = 1 ; i <= n ; ++i) norm.push_back({v[i],i});
    sort(norm.begin(),norm.end(),[](pii a, pii b){return a.first < b.first;});
    v[norm[0].second] = 2;
    int mx = 0;
    for(int i = 1 ; i < n ; ++i)
    {
        if(norm[i].first == norm[i-1].first)
        {
            v[norm[i].second] = v[norm[i-1].second];
        }
        else v[norm[i].second] = v[norm[i-1].second] + 1;
        mx = v[norm[i].second];
    }
    for(int i = 1 ; i <= n ; ++i)
    {
        v[i]--;
        pii prec = query(1,1,mx,v[i]);
        v[i]++;
        p[i] = prec.second;
        dp[i] = prec.first + 1;
        update(1,1,mx,dp[i],v[i],i);
    }
    mx = -1;
    int poz = -1;
    for(int i = 1 ; i <= n ; ++i)
    {
        if(dp[i] > mx)
        {
            mx = dp[i];
            poz = i;
        }
    }
    cout << mx << '\n';
    rec(poz);
    return 0;
}