Cod sursa(job #2448283)

Utilizator AvramDanielAvram Daniel AvramDaniel Data 16 august 2019 14:58:08
Problema Subsir crescator maximal Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>
using namespace std;
#define N 100010

int n,a[N],lis[N],pred[N], lmax;

void scrie(int x){
    if(pred[x] == 0){
        cout<<a[x]<<' ';
        return;
    }
    scrie(pred[x]);
    cout<<a[x]<<' ';
    return;
}

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

    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]>a[lis[lmax]])
        {
            lmax++;
            lis[lmax] = i;
            pred[i]  =lis[lmax-1];
        }
        else if(a[i]<a[lis[1]]){
            lis[1] = i;
            pred[i] = 0;
        }
        else{
            int st = 0, dr = lmax, mid;
            while(dr - st > 1)
            {
                mid = (st + dr)/2;
                if(a[i] <= a[lis[mid]])
                    dr = mid;
                else st = mid;
            }
            lis[dr] = i;
            pred[i] = lis[st];
        }

    }
    cout<<lmax<<'\n';

    scrie(lis[lmax]);


    return 0;
}