Cod sursa(job #2174224)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 16 martie 2018 11:19:03
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int n,v[100010],norm[100010],d[100010],tata[100010],rez[100010];
pair<int,int> aib[100010];

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

pair<int,int> aib_query(int poz)
{
    pair<int,int> val={0,0};
    for(int i=poz;i>0;i-=i&(-i))
        if(aib[i].first>val.first) val=aib[i];
    return val;
}

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[i]=v[i];
    }
    sort(norm+1,norm+n+1);
    int sol=0,pozz=0;
    for(int i=1;i<=n;i++)
    {
        int poz=lower_bound(norm+1,norm+n+1,v[i])-norm;
        pair<int,int> val=aib_query(poz-1);
        d[i]=val.first+1;tata[i]=val.second;
        aib_update(poz,d[i],i);
        if(d[i]>sol) {sol=d[i];pozz=i;}
    }
    printf("%d\n",sol);
    int l=0;
    rez[++l]=v[pozz];
    while(tata[pozz]!=0)
    {
        pozz=tata[pozz];
        rez[++l]=v[pozz];
    }
    for(int i=l;i>=1;i--) printf("%d ",rez[i]);
    return 0;
}