Cod sursa(job #1913210)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 8 martie 2017 12:09:58
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

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

const int NMax = 100005;
const int INF = 2000000002;

int n,nr,last;
int a[NMax],L[NMax],dp[NMax];
vector<int> ans;

int cautbin(int lo,int hi,int x){
    int mid;
    while(lo <= hi){
        int mid = (lo + hi) / 2;
        if(L[mid] >= x && L[mid - 1] < x){
            return mid;
        }else
        if(L[mid] >= x){
            hi = mid - 1;
        }else
        if(L[mid - 1] < x){
            lo = mid + 1;
        }
    }
    return 0;
}
int main()
{
    f >> n;
    for(int i = 1; i <= n; ++i){
        f >> a[i];
    }
    nr = 0;
    for(int i = 1; i <= n; ++i){
        if(L[nr] < a[i]){
            nr++;
            L[nr] = a[i];
            dp[i] = nr;
        }else{
            int e = cautbin(1,nr,a[i]);
            if(e != 0){
                L[e] = a[i];
                dp[i] = e;
            }
        }
    }
    g << nr << '\n';
    last = INF;
    for(int i = n; i >= 1; --i){
        if(dp[i] == nr && a[i] < last){
            ans.push_back(a[i]);
            nr--;
            last = a[i];
        }
    }
    for(int i = ans.size() - 1; i >= 0; --i){
        g << ans[i] << ' ';
    }
    return 0;
}