Cod sursa(job #1736346)

Utilizator refugiatBoni Daniel Stefan refugiat Data 1 august 2016 16:38:17
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100005
using namespace std;
ifstream si("scmax.in");
ofstream so("scmax.out");

int n,res[NMAX],v[NMAX],lst[NMAX],d[NMAX],aib[NMAX],pr[NMAX];

void upd(int x,int i)
{
    for(;x<=n;x+=x&(-x))
        if(d[i]>d[aib[x]])
            aib[x]=i;
}

int query(int x)
{
    int sx=0;
    for(;x;x-=x&(-x))
        if(d[aib[x]]>d[sx])
            sx=aib[x];
    return sx;
}
int main()
{
    si>>n;
    int i,m,sol;
    for(i=1;i<=n;++i)
    {
        si>>v[i];
        res[i]=lst[i]=v[i];
    }

    sort(lst+1,lst+n+1);
    m=1;
    for(i=2;i<=n;++i)
        if(lst[i]!=lst[m])
            lst[++m]=lst[i];

    for(i=1;i<=n;++i)
        v[i]=lower_bound(lst+1,lst+m+1,v[i])-lst;

    for(i=1;i<=n;++i)
    {
        pr[i]=query(v[i]-1);
        d[i]=d[pr[i]]+1;
        upd(v[i],i);
    }
    sol=0;
    for(i=1;i<=n;++i)
    {
        if(d[sol]<d[i])
            sol=i;
    }
    so<<d[sol]<<'\n';

    for(m=0;sol;sol=pr[sol])
    {
        lst[++m]=res[sol];
    }
    while(m)
        so<<lst[m--]<<' ';
    so.close();
    return 0;
}