Cod sursa(job #2140828)

Utilizator dragomirmanuelDragomir Manuel dragomirmanuel Data 23 februarie 2018 21:59:17
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMax = 100005;
int N;
int v[NMax];
int last[NMax], dad[NMax];
int len;

void Read()
{
    fin >> N;
    for(int i=1; i<=N; ++i)
        fin >> v[i];

    for(int i=1; i<=N; ++i)
        dad[i] = -1;
}

void Output(int x)
{
    if(x==-1)
        return;

    Output(dad[x]);
    fout << v[x] << " ";
}

void BinSea(int i)
{
    int st = 1, dr = len, mij;
    while(st<=dr)
    {
        int mij = (st+dr)/2;
        if(v[i] > v[last[mij]])
        {
            st = mij+1;
        }

        else
        {
            dr = mij-1;
        }
    }

    last[st] = i;
    dad[i] = last[st-1];
}

//2   1   3   4
//-1  4   5   8

int main()
{
    Read();
    len = 1;
    last[1] = 1;

    for(int i=2; i<=N; ++i)
    {
        if(v[i] > v[last[len]])
        {
            last[++len] = i;
            dad[i] = last[len-1];
        }

        else if(v[i] < v[last[1]])
        {
            last[1] = i;
            dad[i] = -1;
        }

        else
        {
            BinSea(i);
        }
    }

    fout << len << "\n";
    Output(last[len]);
    return 0;
}