Cod sursa(job #2514851)

Utilizator HumikoPostu Alexandru Humiko Data 26 decembrie 2019 23:46:30
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
//Alex Postu :^)
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <cstring>
#include <bitset>

using namespace std;

//#include <iostream>
#include <fstream>

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

static const int NMAX = 1e5+5;
static const int valmax = 2e9+5;

int v[NMAX];
int dp[NMAX];
int maxLen[NMAX];
int ans[NMAX];

int binSearch (int val, int len) {
	int first = 1;
	int last = len;
	int ans = 0;

	while ( first <= last ) {
		int mid= first+((last-first)>>1);

		if ( dp[mid] < val ) {
			first = mid+1;
			ans = mid;
		}
		else {
			last = mid-1;
		}
	}

	return ans;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int n;
	cin>>n;
	for ( int i = 1; i <= n; ++i ) {
		cin>>v[i];
	}

	for ( int i = 1; i <= n; ++i ) {
		dp[i] = valmax;
	}	

	int scm = 0;
	for ( int i = 1; i <= n; ++i ) {
		int curLen = binSearch(v[i], scm);
		
		dp[curLen+1] = min(v[i], dp[curLen+1]);
		
		scm = max(scm, curLen+1);

		maxLen[i] = curLen+1;
	}

	int pos = scm;
	int idx = 0;

	for ( int i = n; i >= 1; --i ) {
		if ( maxLen[i] == pos ) {
			ans[++idx] = v[i];
			pos--;
		}
	}

	for ( int i = idx; i >= 1; --i ) {
		cout<<ans[i]<<" ";
	}
}