Cod sursa(job #2777511)

Utilizator IoanMihaiIoan Mihai IoanMihai Data 23 septembrie 2021 16:10:46
Problema Subsir crescator maximal Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, a[100005];
int cautare(int arr[], vector<int> v, int st, int dr, int x)
{
    int mij;
    while(dr - st > 1){
        mij = st + (dr - st) / 2;
        if (arr[v[mij]] >= x){
            dr = mij;
        }else{
            st = mij;
        }
    }
    return dr;
}
void Scmax(int N, int v[])
{
    vector<int> tailInd(N, 0);
    vector<int> prevInd(N, -1);
    int len = 1;
    for (int i=1;i<N;i++){
        if (v[i] < v[tailInd[0]]){
            tailInd[0] = i;
        }else if (v[i] > v[tailInd[len - 1]]){
            prevInd[i] = tailInd[len - 1];
            tailInd[len ++] = i;
        }else{
            int pos = cautare(v, tailInd, -1, len - 1, v[i]);
            prevInd[i] = tailInd[pos - 1];
            tailInd[pos] = i;
        }
    }
    int arr[N], l = 0;
    fout << len << '\n';
    for (int i=tailInd[len-1];i>=0;i = prevInd[i]){
        arr[++l] = v[i];
    }
    for (int i=l;i>=1;i--){
        fout << arr[i] << ' ';
    }
    fout << '\n';

}
int main() {
    fin >> n;
    for (int i=0;i<n;i++){
        fin >> a[i];
    }

    Scmax(n, a);
    return 0;
}