Cod sursa(job #2578229)

Utilizator Rares31100Popa Rares Rares31100 Data 10 martie 2020 19:27:22
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");

int n,a[100001],Poz[100001];
int arb[100001],h,tree[100001];
int val[100001],urm[100001];
int sol[100001],t;

int findBin(int val)
{
    int poz=0;

    for(int p=h;p;p/=2)
        if(poz+p<=h && arb[poz+p]<=val)
            poz+=p;

    return poz;
}

int maxim(int poz)
{
    int P=tree[poz];

    while(poz)
    {
        if(val[ tree[poz] ]>val[P])
            P=tree[poz];

        poz-=poz&-poz;
    }

    return P;
}

void update(int poz,int i)
{
    while(poz<=h && val[ tree[poz] ]<=val[i])
    {
        tree[poz]=i;
        poz+=poz&-poz;
    }
}

int main()
{
    in>>n;

    for(int i=1;i<=n;i++)
        in>>a[i];

    for(int i=1;i<=n;i++)
        arb[i]=a[i];

    sort(arb+1,arb+1+n);

    h=1;
    for(int i=2;i<=n;i++)
        if(arb[h]!=arb[i])
            arb[++h]=arb[i];

    for(int i=1;i<=n;i++)
        Poz[i]=findBin(a[i]);

    for(int i=1;i<=n;i++)
    {
        urm[i]=maxim(Poz[i]-1);

        if(urm[i])
            val[i]=val[ urm[i] ]+1;

        update(Poz[i],i);
    }

    int maxim=1;

    for(int i=2;i<=n;i++)
        if(val[maxim]<val[i])
            maxim=i;
        else if(val[maxim]==val[i] && a[maxim]>a[i])
            maxim=i;

    while(maxim)
    {
        sol[++t]=a[maxim];
        maxim=urm[maxim];
    }

    out<<t<<'\n';

    for(int i=t;i>=1;i--)
        out<<sol[i]<<' ';

    return 0;
}