Cod sursa(job #2365789)

Utilizator crion1999Anitei cristi crion1999 Data 4 martie 2019 16:26:16
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda pregatire_cls12_oji Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <stack>
#define NMAX 100005
using namespace std;
ifstream fi("scmax.in");
ofstream fo("scmax.out");

int N;
int sir[NMAX];
int dp[NMAX];
int origin[NMAX];

stack<int> s;
int rez[NMAX];
int leng;

int BS(int a)
{
    int answer = 0;
    for(int step = (1 << 29); step; step >>= 1)
    {
        if(step + answer <= leng && rez[step + answer] < a)
            answer += step;
    }
    return answer;
}

int main()
{
    fi >> N;
    for(int i = 1; i <= N; ++i)
    {
        fi >>sir[i];
        dp[i] = 1;
        origin[i] = 0;
    }
    rez[1] = 1;
    leng = 1;

    for(int i = 2; i <= N; ++i)
    {
        if(sir[i] > sir[rez[leng]])
        {
            rez[++leng] = i;
            origin[i] = rez[leng - 1];
        }
        else
        {
            int poz = BS(i);
            rez[poz] = i;
            origin[i] = rez[poz - 1];
        }
    }
    int index = rez[leng];

    while(index)
    {
        s.push(sir[index]);
        index = origin[index];
    }

    fo << s.size() << "\n";
    while(!s.empty())
    {
        fo << s.top() << " ";
        s.pop();
    }
}