Cod sursa(job #1415093)

Utilizator adriannnscarlatAdrianovici adriannnscarlat Data 3 aprilie 2015 19:08:41
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;

ifstream in("sume.in");
ofstream out("sume.out");
int *v,*res,*lst,*d,*aib,*up,bst,n,i,h=1;

void update(int x, int ind)
{
    for(;x;x+=x^(x-1)&x)
        if(d[ind]>d[aib[x]])
            aib[x]=ind;
}

int query(int x)
{
    int mx=0;
    for(; x; x -= x^(x-1) & x)
        if(d[aib[x]]>d[mx])
            mx=aib[x];
    return mx;
}

int main()
{
    in>>n;

    v=new int[n];
    res=new int[n];
    lst=new int[n];
    d=new int[n];
    aib=new int[n];
    up=new int[n];

    for(i=0;i<=n;++i)
    {
        in>>v[i];
        res[i]=lst[i]=v[i];
    }

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

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

    for(i=1;i<=n;++i)
    {
        up[i]=query(v[i]-1);
        d[i]=d[up[i]]+1;
        update(v[i],i);
    }

    for(i=1;i<=n;++i)
        if(d[bst]<d[i])
            bst=i;

    for(h=0,i=bst;i;i=up[i])
        lst[++h]=res[i];

    for(i=h;i;i--)
        cout<<lst[i]<<" ";

    in.close();
    out.close();
    return 0;
}