Cod sursa(job #2967546)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 19 ianuarie 2023 19:04:03
Problema Subsir crescator maximal Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <unordered_map>
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;

unordered_map <int,int> um;

// 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 refac( int x ){

    if( x == 0 ) return;

    refac(um[x]);

    cout << x << ' ';

}

int main()
{

    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;

            um[a] = dp[x];

            maxim = max(maxim,x+1);
        }

    }

    cout << maxim << '\n';

    refac(dp[maxim]);

    return 0;
}