Cod sursa(job #2011475)

Utilizator infomaxInfomax infomax Data 16 august 2017 13:16:44
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <bits/stdc++.h>

#define f first
#define s second

using namespace std;

ifstream F("scmax.in");
ofstream G("scmax.out");

int n, sol[100003], v[100003], l, po, poz, mij, st, dr, k[100003];
pair<int, int> p[100003];

int main()
{
    F >> n;
    for(int i = 1;  i<= n; ++ i) F >> v[i];
    p[1] = {v[1], 1};
    for(int i = 2; i <= n; ++ i)
    {
        po = -1; st = 1; dr = poz;
        while(st <= dr)
        {
            mij = (st+dr) >> 1;
            if(p[mij].f >= v[i])
                dr = mij - 1, po = mij;
            else st = mij + 1;
        }
        if(po == -1)
            p[++poz] = {v[i], i}, k[i] = p[poz-1].s;
        else p[po] = {v[i], i}, k[i] = p[po-1].s;
    }
    G << poz << '\n';
    poz = p[poz].s;
    while(poz) sol[++l] = poz, poz = k[poz];
    for(int i = l; i > 0; -- i)
        G << v[sol[i]] << " ";
    return 0;
}