Cod sursa(job #2871792)

Utilizator Xutzu358Ignat Alex Xutzu358 Data 15 martie 2022 19:02:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int arbint[400005];
pair < int , int > p[100005];
int n;
int v[100005],lis[100005];
int max_nr = 2000000001;
stack < int > st;

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

void buildTree(int pos, int st, int dr, int index, int value){
    if (index<st || index>dr) return;
    if (st==dr) {
        arbint[pos] = value;
        lis[st] = value;
        return;
    }
    int mij = (dr+st)/2;
    buildTree(2*pos,st,mij,index,value);
    buildTree(2*pos+1,mij+1,dr,index,value);
    arbint[pos] = max(arbint[2*pos],arbint[2*pos+1]);
}

int findMax(int pos, int st, int dr, int start, int end){
    if (st>=start && dr<=end) return arbint[pos];
    if (start>dr || end<st) return 0;
    int mij = (dr+st)/2;
    return max(findMax(2*pos,st,mij,start,end),findMax(2*pos+1,mij+1,dr,start,end));
}

void findLIS() {
    for (int i=1;i<=n;i++) {
        f >> v[i];
        p[i].first = v[i];
        p[i].second = i;
    }
    sort(p+1,p+n+1,compare);
    for (int i=1;i<=n;i++) {
        buildTree(1,1,n,p[i].second,findMax(1,1,n,1,p[i].second)+1);
    }
}

int main()
{
    f >> n;
    findLIS();
    g << arbint[1] << '\n';
    for (int i=n;i>=1;i--) {
        if (lis[i]==arbint[1] && v[i]<max_nr) {
            arbint[1]--;
            st.push(v[i]);
            max_nr = v[i];
        }
    }
    while (st.empty()==0) {
        g << st.top() << " ";
        st.pop();
    }
    return 0;
}