Cod sursa(job #640982)

Utilizator andra23Laura Draghici andra23 Data 26 noiembrie 2011 22:08:12
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>

using namespace std;

const int MAXN = 100010;
int a[MAXN], s[MAXN], parent[MAXN];

int bsearch(int left, int right, int x, int a[], int s[]) {
	int pos = right, m;
	while (left <= right) {
		m = (left+right)/2;
		if (a[s[m]] >= x) {
			pos = m;
			right = m-1;
		} else {
			left = m+1;
		}
	}
	return pos;
}

int main() {
	ifstream f("scmax.in");
	ofstream g("scmax.out");
	int n;
	f >> n;
	for (int i = 0; i < n; i++) {
		f >> a[i];
	}

	int tail = 1;
	s[0] = -1;
	parent[0] = -1;
	s[1] = 0;
	for (int i = 1; i < n; i++) {
		if (a[s[tail]] < a[i]) {
			tail++;
			s[tail] = i;
			parent[i] = s[tail-1]; 
		} else {
			int pos = bsearch(1, tail, a[i], a, s);
			s[pos] = i;
			parent[i] = s[pos-1];
		}
	}

	g << tail << '\n';
	int element = s[tail];
	vector <int> result;
	while (element != -1) {
		result.push_back(a[element]);
		element = parent[element];
	}
	reverse(result.begin(), result.end());
	for (int i = 0; i < result.size(); i++) {
		g << result[i] << " ";
	}
	g << '\n';

	return 0;
}