Cod sursa(job #1799428)

Utilizator george_stelianChichirim George george_stelian Data 6 noiembrie 2016 12:45:20
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> norm;
int v[100010],d[100010],tata[100010],sol[100010],aib[100010],n;

int poz_norm(int x)
{
    return lower_bound(norm.begin(),norm.end(),x)-norm.begin()+1;
}

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

int aib_query(int i)
{
    int poz=0;
    for(;i>0;i-=i&(-i))
        if(d[aib[i]]>d[poz]) poz=aib[i];
    return poz;
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&v[i]);
        norm.push_back(v[i]);
    }
    sort(norm.begin(),norm.end());
    for(int i=1;i<=n;i++)
    {
        int a=poz_norm(v[i]);
        int poz=aib_query(a-1);
        d[i]=d[poz]+1;
        tata[i]=poz;
        aib_update(a,i);
    }
    int poz=0,nr=0;
    for(int i=1;i<=n;i++)
        if(d[i]>d[poz]) poz=i;
    for(int i=poz;i>0;i=tata[i]) sol[++nr]=v[i];
    printf("%d\n",nr);
    for(int i=nr;i;i--) printf("%d ",sol[i]);
    return 0;
}