Cod sursa(job #611135)

Utilizator marius.bucurBucur Marius - Ovidiu marius.bucur Data 30 august 2011 22:13:23
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<stack>
#define MAXN 100000

using namespace std;

int A[MAXN];
int B[MAXN];
int P[MAXN];
int PREV[MAXN];
int p;
int N;

int main() {
	ifstream in("scmax.in");
	ofstream out("scmax.out");
	in >> N;
	PREV[0] = -1;
	P[0] = -1;
	for(int i = 0; i < N; i++) {
		in >> A[i];
	}
	for(int i = 0; i < N; i++) {
		int* pos = lower_bound(B, B + p, A[i]);
		*pos = A[i];
		if(i != 0)
			PREV[i] = PREV[P[pos - B]];
		P[pos - B] = i;
		if(pos - B >= p) {
			if(i != 0)
				PREV[i] = P[pos - B - 1];
			p++;
		}
	}
	out << p << "\n";
	stack<int> S;
	for(int i = P[p-1]; i >= 0; i = PREV[i]) {
		printf("%d \n", i);
		S.push(A[i]);
	}
	for(int i = 0; i < p; i++) {
		printf("(%d - %d - %d)", B[i], P[i], PREV[P[i]]);
		int el = S.top();
		S.pop();
		out << el << " ";
	}
}