Cod sursa(job #2791593)

Utilizator etienAndrone Stefan etien Data 30 octombrie 2021 20:15:02
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int aib[100001];
int val[100001],v[100001],best[100001];
int n;
pair<int,pair<int,int>>p[100001];
vector<int>vv[100001];
stack<int>st;
bool cmp(pair<int,pair<int,int>>a,pair<int,pair<int,int>>b)
{
    return a.second.second<b.second.second;
}
void norm(int v[],int n)
{
    for(int i=1;i<=n;i++)
        p[i].first=v[i];
    for(int i=1;i<=n;i++)
        p[i].second.second=i;
    sort(p+1,p+n+1);
    int nr=0;
    for(int i=1;i<=n;i++)
        if(p[i].first!=p[i-1].first)
            p[i].second.first=++nr;
        else p[i].second.first=nr;
    sort(p+1,p+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        val[p[i].second.first]=p[i].first;
        v[i]=p[i].second.first;
    }
}
int pre[100001];
void update(int val,int poz)
{
    if(poz==0)
        return;
    while(poz<=n)
    {
        aib[poz]=max(aib[poz],val);
        poz+=(poz&(-poz));
    }
}
int query(int poz)
{
    int maxi=0;
    while(poz>0)
    {
        maxi=max(maxi,aib[poz]);
        poz-=(poz&(-poz));
    }
    return maxi;
}
int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    norm(v,n);
    for(int i=1;i<=n;i++)
    {
        best[v[i]]+=max(0,query(v[i]-1)+1-best[v[i]]);
        update(best[v[i]],v[i]);
    }
    for(int i=1;i<=n;i++)
        if(best[v[i]]!=0)
            vv[best[v[i]]].push_back(v[i]);
    int i;
    for(i=1;vv[i].size()>0;i++);;
    i--;
    st.push(vv[i][vv[i].size()-1]);
    i--;
    while(i>0)
    {
        for(int p=0;p<vv[i].size();p++)
            if(vv[i][p]<st.top()&&val[vv[i][p]]<val[st.top()])
                st.push(vv[i][p]);
        i--;
        //cout<<i<<" ";
    }
    fout<<st.size()<<"\n";
    while(!st.empty())
    {
        fout<<val[st.top()]<<" ";
        st.pop();
    }
}