Cod sursa(job #2659020)

Utilizator loraclorac lorac lorac Data 15 octombrie 2020 17:38:51
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int lim=1e5+4;
struct node
{
    int bst;
    int unde;
}tree[4*lim];
int v[lim];
int srt[lim];
int poz[lim];
int opt[lim];
int last[lim];
bool mycmp(int a,int b)
{
    return v[a]<v[b];
}
node add(node a,node b)
{
    if(a.bst>b.bst)
        return a;
    if(a.bst<b.bst)
        return b;
    return a;
}
void update(int nod,int l,int r,int poz)
{
    if(l==r)
    {
        tree[nod]={opt[srt[l]],srt[l]};
        return ;
    }
    int med=(l+r)/2;
    if(poz<=med) update(2*nod,l,med,poz);
    else update(2*nod+1,med+1,r,poz);
    tree[nod]=add(tree[2*nod],tree[2*nod+1]);
}
node query(int nod,int l,int r,int val)
{
    if(v[srt[r]]<val) return tree[nod];
    int med=(l+r)/2;
    if(v[srt[med+1]]>=val) return query(2*nod,l,med,val);
    return add(tree[2*nod],query(2*nod+1,med+1,r,val));
}
stack<int> st;
int main()
{
    int n;
    in>>n;
    for(int i=1;i<=n;++i)
    {
        in>>v[i];
        srt[i]=i;
    }
    sort(srt+1,srt+n+1,mycmp);
    for(int i=1;i<=n;++i)
        poz[srt[i]]=i;
    int maxim=0,fin=0;
    for(int i=1;i<=n;++i)
    {
        if(v[i]==v[srt[1]])
        {
            opt[i]=1;
            last[i]=0;
            update(1,1,n,poz[i]);
            if(opt[i]>maxim)
                maxim=opt[i],fin=i;
            continue;
        }
        node ans=query(1,1,n,v[i]);
        opt[i]=ans.bst+1;
        last[i]=ans.unde;
        update(1,1,n,poz[i]);
        if(opt[i]>maxim)
            maxim=opt[i],fin=i;
    }
    out<<maxim<<'\n';
    for(int i=1;i<=maxim;++i)
    {
        st.push(v[fin]);
        fin=last[fin];
    }
    while(!st.empty())
        out<<st.top()<<' ',st.pop();
    return 0;
}