Cod sursa(job #1516934)

Utilizator GuzgleteBumbu Alexandru Guzglete Data 3 noiembrie 2015 18:49:36
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <stack>

using namespace std;

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

int n,k;
int v[100010],maxim[100010],prec[100010];
int aux[100010],poz[100010]; // aux=vectorul in care facem cautarea binara
stack <int> rez;
int cautare_binara (int st, int dr, int x)
{
    if (st==dr)
        return st;

    int m=(st+dr)/2;

    if (x<aux[m])
        return cautare_binara (st,m,x);
    return cautare_binara (m+1,dr,x);
}

void creare ()
{
    maxim[1]=1;
    prec[1]=0;
    aux[1]=v[1];
    poz[1]=1;
    k=1;

    for (int i=2;i<=n;i++)
    {
        if (v[i]>aux[k])
        {
            prec[i]=poz[k];
            maxim[i]=maxim[poz[k]]+1;
            k++;
            aux[k]=v[i];
            poz[k]=i;
        }

        else
        {
            int x=cautare_binara(1,k,v[i]);
            prec[i]=poz[x-1];
            maxim[i]=maxim[poz[x]];
            aux[x]=v[i];
            poz[x]=i;
        }
    }
}

void afisare ()
{
    fout<<k<<"\n";
    int i=poz[k];
    while (i)
    {
        rez.push (v[i]);
        i=prec[i];
    }
    while (!rez.empty())
    {
        fout<<rez.top()<<" ";
        rez.pop();
    }
}

int main()
{
    fin>>n;
    for (int i=1;i<=n;i++)
        fin>>v[i];
    creare();
    afisare();
    return 0;
}