Cod sursa(job #901207)

Utilizator andrei.finaruFinaru Andrei Emanuel andrei.finaru Data 1 martie 2013 08:22:46
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int n,ib,o[100005],v[100005],norm[100005],pre[100005],arb[100005],best[100005];

void updat(int u, int x)
{
    for(;u<=n; u = u + ( ( u^(u-1)) & u ) )
        if(best[x]>best[arb[u]]) arb[u]=x;
}

int quer(int x)
{
    int maxi=0;
    for(; x ; x = x - ( (x^(x-1)) & x) )
        if(best[arb[x]]>best[maxi]) maxi=arb[x];
    return maxi;
}

/*void afis(int i)
{
    if(pre[i]) afis(pre[i]);
    g<<o[i]<<' ';
}*/

int main()
{
    int k,i;
    f>>n;
    for(i=1;i<=n;++i) f>>v[i], o[i]=norm[i]=v[i];
    sort(norm+1,norm+n+1);
    k=1;
    for(i=2;i<=n;++i) if(norm[i]!=norm[k]) norm[++k]=norm[i];
    for(i=1;i<=n;++i) v[i]=lower_bound(norm+1,norm+k+1,v[i]) - norm;
    ib=1;
    for(i=1;i<=n;++i)
    {
        pre[i]=quer(v[i]-1);
        best[i]=best[pre[i]]+1;
        updat(v[i],i);
        if(best[ib]<best[i]) ib=i;
    }
    g<<best[ib]<<'\n';
    //afis(ib);
    k=0;
    for(i=ib;i;i=pre[i]) norm[++k]=o[i];
    for(i=k;i;--i) g<<norm[i]<<' ';
    g<<'\n';
    f.close(); g.close();
    return 0;
}