Cod sursa(job #3273289)

Utilizator PetruApostolApostol Mihnea Petru PetruApostol Data 1 februarie 2025 15:19:46
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

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

pair<int,int> v[100001];

int inainte[100001];
int aux[100001];
int dp[100001];


struct arbore{
    int poz,max1;
} aint[400000];

arbore combin(arbore a,arbore b){
    if(a.max1>b.max1) return a;
    return b;
}

arbore query(int nod,int st,int dr,int a,int b  ){
    if(a<=st && dr<=b) return aint[nod];
    if(a>dr || b<st) return {-1,-(int)1e9};
    int mij=(st+dr)/2;
    return combin(query(2*nod,st,mij,a,b),query(2*nod+1,mij+1,dr,a,b));
}

void update(int nod,int st,int dr,int a,int val,int poz1){
    if(st==dr){
        aint[nod].max1=val;
        aint[nod].poz=poz1;
        return ;
    }
    int mij=(st+dr)/2;
    if(a<=mij){
        update(2*nod,st,mij,a,val,poz1);
    }else{
        update(2*nod+1,mij+1,dr,a,val,poz1);
    }
    aint[nod]=combin(aint[2*nod],aint[2*nod+1]);
}

bool cmp(pair<int,int> a,pair<int,int> b){
    if(a.first!=b.first) return a.first<b.first;
    return a.second>b.second;
}

bool cmp1(pair<int,int> a,pair<int,int> b){
    return a.second<b.second;
}

int main()
{
    int n,i,ci;cin>>n;
    for(i=1;i<=n;i++){
        cin>>v[i].first;
        v[i].second=i;
    }
    sort(v+1,v+n+1,cmp);
    for(i=1;i<=n;i++){
        aux[v[i].second]=i;
    }
    sort(v+1,v+n+1,cmp1);
    ci=0;
    for(i=1;i<=n;i++){
        arbore aux1=query(1,1,n,1,aux[i]);
        inainte[i]=aux1.poz;
        dp[i]=aux1.max1+1;
        if(dp[i]>dp[ci]) ci=i;
        if(dp[i]==1) inainte[i]=-1;
        update(1,1,n,aux[i],dp[i],i);
    }
    cout<<dp[ci]<<"\n";
    vector<int> viz;
    while(ci!=-1){
        viz.push_back(v[ci].first);
        ci=inainte[ci];
    }
    for(i=viz.size()-1;i>=0;i--){
        cout<<viz[i]<<" ";
    }
    return 0;
}