Cod sursa(job #1907335)

Utilizator timihaitaTimaru Mihaita timihaita Data 6 martie 2017 18:53:09
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#define NMax 100010
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, el[NMax], dp[NMax], lastPos[NMax], answ[NMax], len;
int bin_src(int left, int right, int val)
{
    int ans = -1;
    while (left <= right)
        {
        int mid = (left + right) / 2;
        if (val <= dp[mid]) {
            ans = mid;
            right = mid - 1;
        }
        else
            left = mid + 1;
    }
    return ans;
}
int main()
{
    f >> n;
    for (int i = 1; i <= n; i++)
        f >> el[i];
    for (int i = 1; i <= n; i++) {
        int pos = bin_src(1, len, el[i]);
        if (pos == -1) {
            ++len;
            dp[len] = el[i];
            lastPos[i] = len;
        }
        else {
            dp[pos] = el[i];
            lastPos[i] = pos;
        }
    }
    int crt = len;
    for (int i = n; i >= 1; i--) {
        if (lastPos[i] == crt) {
            answ[crt] = el[i];
            crt--;
        }
    }
    g << len << "\n";
    for (int i = 1; i <= len; i++)
        g << answ[i] << ' ';
}