Cod sursa(job #1017056)

Utilizator supermitelArdelean Razvan Mitel supermitel Data 27 octombrie 2013 08:50:55
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>

using namespace std;

vector<int> q;

int a[100010];
int p[100010];
int prec[100010];
int last[100010];
int n, best, bestpoz;

void citire()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        scanf("%d", a+i);
}

int inser(int y)
{
    int st = 0, dr = q.size(), mij;
    int x = a[y];

    while(st < dr)
    {
        mij = (st+dr) / 2;
        if(q[mij] < x)
            st = mij + 1;
        else if(q[mij] >= x)
            dr = mij;
    }

    if(st < q.size())
    {
        q[st] = x;
        return st;
    }
    q.push_back(x);
    return q.size()-1;
}

void afisare(int x)
{
    if(x == 0)
        return;
    afisare(prec[x]);
    printf("%d ", a[x]);
}

void solve()
{
    int i, j, poz;
    for(i = 1; i <= n; i++)
    {
        poz = inser(i) + 1;
        p[i] = poz;
        last[poz] = i;
        prec[i] = last[poz-1];
        if(poz > best)
        {
            best = poz;
            bestpoz = i;
        }
    }
    printf("%d\n", best);
    afisare(last[best]);
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    citire();
    solve();

    return 0;
}