Cod sursa(job #2967534)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 19 ianuarie 2023 18:53:50
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include<fstream>
#include<vector>
using namespace std;

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

const int NMAX = 1e5 + 1;
const int INF = 1 << 30;

vector<int> dp(NMAX,INF),maxim(NMAX);///dp[i] = valoarea minima in care se termina un subsir de lungime j

int v[NMAX];

int bin(int st,int dr,int val)
{
    int ans = -1;
    while(st <= dr)///caut prima pozitie mai mare decat val
        {
            int mid = st + (dr - st) / 2;
            if(dp[mid] > val)
                {
                    ans = mid;
                    dr = mid - 1;
                }

            else st = mid + 1;
        }

    return ans;
}

void afis(int l,int dr)
{
    if(!l || !dr)
        return;

    while(dr >= 1)
        {
            if(maxim[dr] == l)
                {
                    afis(l - 1,dr - 1);
                    cout << v[dr] << " ";
                    return;
                }

            dr--;
        }
}

int main()
{


    int n,x,dr = 0; cin >> n;
    dp[0] = -INF;
    for(int i = 1; i <= n ; i++)
        {
            cin >> x;
            v[i] = x;
            if(dp[dr] < x)
                {
                    dp[++dr] = x;
                    maxim[i] = dr;
                }


            else
                {
                    int pos = bin(0,dr,x);
                    dp[pos] = x;
                    maxim[i] = pos;
                }
        }

    cout << dr << '\n';
    afis(dr,n);
}