Cod sursa(job #2174729)

Utilizator raul044Moldovan Raul raul044 Data 16 martie 2018 13:10:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
#define maxN 100005
#include <queue>
#include <stack>
#include <vector>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

long long v[maxN], n, poz, pre[maxN], trv[maxN], tri[maxN];
stack <int> st;

int binar (int left, int right, int x) {
    int mid = (left + right)/2;
    if (left <= right) {
        if (trv[mid] < x) {
            return binar(mid+1, right, x);
        }
        else
            return binar(left, mid-1, x);
    }
    return mid;
}

int main () {
    fin >> n;
    for (int i = 1; i <= n; ++i) {
        fin >> v[i];
    }
    trv[1] = v[1];
    tri[1] = 1;
    int MAXL = 1;
    for (int i = 2; i <= n; ++i) {
        poz = binar(1, MAXL, v[i]);
        if (poz == MAXL) {
            MAXL++;
        }
        trv[poz+1] = v[i];
        tri[poz+1] = i;
        pre[i] = tri[poz];
    }
    fout << MAXL << '\n';
    int p = tri[MAXL];
    while (p) {
      st.push(v[p]);
      p = pre[p];
    }
    while (!st.empty()) {
        fout << st.top() << " ";
        st.pop();
    }
}