Cod sursa(job #2174196)

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

using namespace std;

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

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

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

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