Cod sursa(job #2967569)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 19 ianuarie 2023 19:22:00
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
using namespace std;

const int MAX = 1e5 + 2;

const int inf = 2e9 + 1;

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

int dp[MAX], v[MAX] , n , a , maxim , x , pre[MAX] , ind[MAX];

// dp[i] = numarul minim cu care s-ar termina un subsir de lungime i;

 int bs( int x ){

    int st = 0 , dr = n;

    int mij , ans;

    while( st <= dr ){

        mij = (st+dr)/2;

        if(dp[mij] < x){

            ans = mij;

            st = mij + 1;

        }else dr = mij - 1;
    }

    return ans;
}

void rec( int x ){

    if(!x) return;

    rec(pre[x]);

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

}

int main()
{
    int poz;

    cin >> n;

    dp[0] = 0;

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

        dp[i] = inf;
    }

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

        cin >> v[i];

        a = v[i];

        x = bs(a);

        if( x + 1 <= n && a < dp[x+1]){

            dp[x + 1] = a;

            pre[i] = ind[x];

            ind[x + 1] = i;

            if( x + 1 > maxim ){

                maxim = x + 1;

                poz = i;
            }
        }

    }

    cout << maxim << '\n';

    rec(poz);

    return 0;
}