Cod sursa(job #2174636)

Utilizator serbanSlincu Serban serban Data 16 martie 2018 12:48:50
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>

using namespace std;

int a[100005];

int k[100005];
int prec[100005];

int r = 0;

int caut(int l, int r, int x) {
    if(l > r) return l;

    int m = (l + r) / 2;

    if(a[k[m]] > x) return caut(l, m - 1, x);
    else if(a[k[m]] == x) return m;
    else return caut(m + 1, r, x);
}

int main()
{
    ifstream f("scmax.in");
    ofstream g("scmax.out");

    int n;
    f >> n;
    for(int i = 1; i <= n; i ++)
        f >> a[i];

    for(int i = 1; i <= n; i ++) {
        if(a[i] > a[ k[r] ]) {
            r += 1;
            k[r] = i;
            prec[i] = k[r - 1];
        }
        else {
            int place = caut(0, r, a[i]);
            k[place] = i;
            prec[i] = k[place - 1];
        }
    }

    g << r << "\n";

    vector<int> ans;
    ans.clear();
    int i = k[r];
    while(i != 0) {
        ans.push_back(a[i]);
        i = prec[i];
    }

    for(int i = ans.size() - 1; i >= 0; i --) g << ans[i] << " ";
    g << "\n";
    return 0;
}