Cod sursa(job #3287183)

Utilizator tudorhTudor Horobeanu tudorh Data 16 martie 2025 19:48:19
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.3 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
;
struct nod
{
    int best,val,pos;
};
nod aint[400001];
vector<pair<int,int>>a;
bool compare(pair<int,int>a,pair<int,int>b)
{
    return (a.first<b.first || (a.first==b.first && a.second<b.second));
}
void update(int v,int st,int dr,int pos,nod rasp)
{
    if(st==dr)
        aint[v]=rasp;
    else
    {
        int mid=(st+dr)/2;
        if(pos<=mid)
            update(v*2,st,mid,pos,rasp);
        else update(v*2+1,mid+1,dr,pos,rasp);
        if(aint[v*2].best>aint[v*2+1].best)
            aint[v]=aint[v*2];
        else if(aint[v*2+1].best>aint[v*2].best)
            aint[v]=aint[v*2+1];
        else
        {
            aint[v]=aint[v*2];
            aint[v].val=min(aint[v].val,aint[v*2+1].val);
        }
    }
}
int best,val,pos;
void query(int v,int st,int dr,int qst,int qdr)
{
    if(qst<=st && qdr>=dr)
    {
        if(aint[v].best>best)
        {
            best=aint[v].best;
            val=aint[v].val;
            pos=aint[v].pos;
        }
        else if(aint[v].best==best && aint[v].val<val)
        {
            val=aint[v].val;
            pos=aint[v].pos;
        }
    }
    else
    {
        int mid=(st+dr)/2;
        if(qst<=mid)
            query(v*2,st,mid,qst,qdr);
        if(qdr>mid)
            query(v*2+1,mid+1,dr,qst,qdr);

    }
}
vector<pair<int,int>>ans;
int main()
{
    int n,x,lmax=0;
    fin>>n;
    for(int i=1; i<=n; i++)
    {
        fin>>x;
        a.push_back({x,i});
    }
    sort(a.begin(),a.end(),compare);
    for(int i=0; i<n; i++)
    {
        best=0;
        val=2e9+1;
        query(1,1,n,1,a[i].second);
        if(a[i].first==val && val)
            best--;
        update(1,1,n,a[i].second,{best+1,a[i].first,a[i].second});
        lmax=max(best+1,lmax);
    }
    fout<<lmax<<'\n';
    vector<pair<int,int>>ans;
    for(int i=lmax;i>=1;i--)
    {
        best=0;
        val=2e9+1;
        pos=1e6;
        if(i==lmax)
            query(1,1,n,1,n);
        else
            query(1,1,n,1,ans[ans.size()-1].second-1);
        ans.push_back({val,pos});
    }
    reverse(ans.begin(),ans.end());
    for(int i=0;i<ans.size();i++)
        fout<<ans[i].first<<" ";
    return 0;
}