Monday, June 8, 2015

UVa 481 - What Goes Up

// UVa 481 - What Goes Up
#include <iostream>
#include <vector>
using namespace std;

#define datatype signed long long int

vector<datatype> a, T, R, seq;

datatype find(datatype ini, datatype fin, datatype v) {
	if (ini >= fin)
		return ini;
	datatype mid = (ini + fin) / 2;
	if (a[T[mid]] < v)
		return find(mid + 1, fin, v);
	else
		return find(ini, mid, v);
}

int main() {

	datatype v;
	datatype i = -1;
	while (cin >> v) {
		a.push_back(v);
		i++;
		datatype pos = T.size() > 0 ? find(0, T.size() - 1, v) : 0;
		if (T.size() > 0 && a[T[pos]] < v)
			pos++;
		if (pos == 0) {
			R.push_back(-1);
			if (T.size() == 0)
				T.push_back(i);
			else if (v < a[T[0]])
				T[0] = i;
		} else if (pos == T.size()) {
			R.push_back(T[pos - 1]);
			T.push_back(i);
		} else {
			T[pos] = i;
			R.push_back(T[pos - 1]);
		}
	}
	cout << T.size() << endl;
	cout << "-" << endl;
	datatype pos = T[T.size() - 1];
	while (pos != -1) {
		seq.push_back(pos);
		pos = R[pos];
	}

	for (int i = seq.size() - 1; i >= 0; i--) {
		cout << a[seq[i]] << endl;
	}

	return 0;
}

No comments:

Post a Comment