Cod sursa(job #2964237)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 12 ianuarie 2023 18:01:19
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
using namespace std;

const int MAX = 1e5 + 1;

ifstream cin("scmax.in");
ofstream cout("scmax.out");

int dp[MAX] , a , ans , n , v[MAX] , poz , pre[MAX];

struct{

    int val , poz;

} aint[4*MAX];

void update( int nod , int st , int dr , int poz){

    if(st == dr){

        aint[nod].val = dp[st];

        aint[nod].poz = st;

    }else{

        int mij = (st+dr)/2;

        if(poz <= mij) update(nod*2,st,mij,poz);
        else update(nod*2+1,mij+1,dr,poz);

        if(aint[nod*2].val > aint[nod*2+1].val) aint[nod] = aint[nod*2];
        else aint[nod] = aint[nod*2+1];
    }

}

void query( int nod , int st , int dr , int value){

    if( v[aint[nod].poz] < value ){

        if(aint[nod].val > ans){

            ans = aint[nod].val;

            poz = aint[nod].poz;
        }

    }else{

        int mij = (st+dr)/2;

        query(nod*2,st,mij,value);
        query(nod*2+1,mij+1,dr,value);
    }

}

void afisarerec( int x ){

    if(x == 0) return;

    afisarerec(pre[x]);

    cout << v[x] << ' ';

}

int main()
{

    cin >> n;

    int maxim = 0;

    int pozmax;

    for(int i = 1 ; i <= n ; i++){

        cin >> v[i];

        query(1,1,n,v[i]);

        pre[i] = poz;

        dp[i] = ans + 1;

        if(dp[i] > maxim){

            maxim = dp[i];

            pozmax = i;
        }

        ans = 0;

        poz = 0;

        update(1,1,n,i);
    }

    cout << maxim << '\n';

    afisarerec(pozmax);

    return 0;
}