Cod sursa(job #2373858)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 7 martie 2019 15:31:22
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;

int v[100010],n,tata[100010],v1[100010];
vector<int> q;
pair<int,int> aib[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={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);
    int ans=0,wh,l=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&v[i]);
        q.push_back(v[i]);
    }
    sort(q.begin(),q.end());
    for(int i=1;i<=n;i++)
    {
        int poz=lower_bound(q.begin(),q.end(),v[i])-q.begin()+1;
        pair<int,int> s=query(poz-1);
        s.first++;
        tata[i]=s.second;
        if(s.first>ans) {ans=s.first;wh=i;}
        s.second=i;
        update(poz,s);
    }
    printf("%d\n",ans);
    for(;wh>0;wh=tata[wh]) v1[++l]=wh;
    for(int i=l;i>=1;i--) printf("%d ",v[v1[i]]);
    return 0;
}