Cod sursa(job #2373897)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 7 martie 2019 15:43:18
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 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;
}

const int Buffer=1<<20;
int poz_pars;
char pars[Buffer];

void inc()
{
    if(++poz_pars==Buffer)
    {
        poz_pars=0;
        fread(pars,1,Buffer,stdin);
    }
}

int read()
{
    int s=0;
    for(;pars[poz_pars]<'0' or pars[poz_pars]>'9';inc());
    for(;pars[poz_pars]>='0' && pars[poz_pars]<='9';inc()) s=s*10+pars[poz_pars]-'0';
    return s;
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    fread(pars,1,Buffer,stdin);
    int ans=0,wh,l=0;
    n=read();
    for(int i=1;i<=n;i++)
    {
        v[i]=read();
        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;
}