Cod sursa(job #1680346)

Utilizator Player1Player 1 Player1 Data 8 aprilie 2016 17:42:41
Problema Subsir crescator maximal Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <stdio.h>
#include <vector>
#define NMIN 2000000003

using namespace std;

int main(){
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out","w", stdout);
	long n, i, j, maxElem, minElem, indexMax, biggestMin, indexBig, x, vecMax, indexVec;
	scanf("%ld ", &n);
	vector<vector<long>> solutions;
	scanf("%ld ", &x);
	vector<long> temp(1,x);
	solutions.push_back(temp);
	vecMax = 1; indexVec = 0;
	for(i = 1; i < n; i++){
		scanf("%ld ", &x);
		maxElem = 0;
		minElem = NMIN;
		biggestMin = 0;
		for(j = 0; j < solutions.size(); j++){
			if(solutions[j][solutions[j].size() - 1] > maxElem){
				maxElem = solutions[j][solutions[j].size() - 1];
				indexMax = j;
			}
			if(solutions[j][solutions[j].size() - 1] < minElem)
				minElem = solutions[j][solutions[j].size() - 1];
			if((solutions[j][solutions[j].size() - 1] > biggestMin) && (solutions[j][solutions[j].size() - 1] < x)){
				biggestMin = solutions[j][solutions[j].size() - 1];
				indexBig = j;
			}
		}
		if(x > maxElem){
			vector<long> tm(solutions[indexMax]);
			tm.push_back(x);
			solutions.push_back(tm);
			if(solutions[solutions.size()-1].size() > vecMax){
				vecMax = solutions[solutions.size()-1].size();
				indexVec = solutions.size()-1;
			}
		} else if(x < minElem){
			temp[0] = x;
			solutions.push_back(temp);
		} else if((x > minElem) && (x < maxElem) && (biggestMin != 0)){
			solutions[indexBig].push_back(x);
			int sz = solutions[indexBig].size();
			if(sz > vecMax){
				vecMax = sz;
				indexVec = indexBig;
			}
			for(j = 0; j < solutions.size(); j++)
				if((solutions[j].size() == sz) && (j != indexBig)){
					solutions.erase(solutions.begin()+j);
					break;
				}
		}
	}
	printf("%ld\n", vecMax);
	for(i = 0; i < solutions[indexVec].size(); i++)
		printf("%ld ", solutions[indexVec][i]);
	
	return 0;
}