Cod sursa(job #2365443)

Utilizator CronosClausCarare Claudiu CronosClaus Data 4 martie 2019 13:45:51
Problema Subsir crescator maximal Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>

using namespace std;

const int mxn = 100 * 1000 + 10;

int n;

int CeilIndex(vector<int>& v, int l, int r, int key)
{
    while (r - l > 1) {
        int m = l + (r - l) / 2;
        if (v[m] >= key)
            r = m;
        else
            l = m;
    }

    return r;
}

int solve(vector<int>& v)
{
    if (v.size() == 0)
        return 0;

    vector<int> tail(v.size(), 0);
    int length = 1;

    tail[0] = v[0];
    for (size_t i = 1; i < v.size(); i++) {
        if (v[i] < tail[0])
            tail[0] = v[i];
        else if (v[i] > tail[length - 1])
            tail[length++] = v[i];
        else
            tail[CeilIndex(tail, -1, length - 1, v[i])] = v[i];
    }

    return length;
}

int main()
{
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
    cin>> n;
    vector< int > v;
    for(int i = 1, x; i <= n; i++){
        cin>> x;
        v.push_back( x );
    }
    cout<< solve( v );
    return 0;
}