Cod sursa(job #2548927)

Utilizator Dan_BDan Bugnariu Dan_B Data 17 februarie 2020 10:22:18
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n,arb[4*nmax],dp[nmax],last[nmax],cpy[nmax];
pair<int,int>v[nmax];
vector<int>sol;
void update(int st,int dr,int poz,int pz,int val)
{
    if(st>pz || dr<pz) return;
    if(st==dr)
    {
        arb[poz]=pz;
        dp[pz]=val;
        return;
    }
    int mid=(st+dr)/2;
    update(st,mid,poz*2,pz,val);
    update(mid+1,dr,poz*2+1,pz,val);
    if(dp[arb[poz*2]]<dp[arb[poz*2+1]]) arb[poz]=arb[poz*2+1];
    else arb[poz]=arb[poz*2];
}
int fnd(int st,int dr,int poz,int a,int b)
{
    if(st>b || dr<a) return 0;
    if(st>=a && dr<=b) return arb[poz];
    int mid=(st+dr)/2;
    int e1=fnd(st,mid,2*poz,a,b);
    int e2=fnd(mid+1,dr,2*poz+1,a,b);
    if(dp[e1]<dp[e2]) return e2;
    else return e1;
}
bool cmp(pair<int,int> st,pair<int,int> dr)
{
    if(st.first==dr.first) return st.second>dr.second;
    return st.first<dr.first;
}
void read()
{
    in>>n;
    for(int i=1;i<=n;i++)
    {
        in>>v[i].first;
        cpy[i]=v[i].first;
        v[i].second=i;
    }
}
void solve()
{
    sort(v+1,v+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        int elem=fnd(1,n,1,1,v[i].second);
        update(1,n,1,v[i].second,dp[elem]+1);
        last[v[i].second]=elem;
    }
    out<<dp[arb[1]]<<'\n';
    for(int pz=arb[1];pz!=0;pz=last[pz])
    {
        sol.push_back(pz);
    }
    for(int i=sol.size()-1;i>=0;i--)
    {
        out<<cpy[sol[i]]<<' ';
    }
}
int main()
{
    read();
    solve();
    return 0;
}