Cod sursa(job #2174221)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 16 martie 2018 11:18:30
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 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={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)
    {
        fread(pars,1,Buffer,stdin);
        poz_pars=0;
    }
}

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);
    //scanf("%d",&n);
    n=read();
    for(int i=1;i<=n;i++)
    {
        //scanf("%d",&v[i]);
        v[i]=read();
        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;
}