Cod sursa(job #1801258)

Utilizator DoubleNyNinicu Cristian DoubleNy Data 8 noiembrie 2016 20:06:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <bits/stdc++.h>
using namespace std;

int arr[100000], len[100000], pos[100000];
int n;
int best;

int BS(int low, int up, int x){
	int mid;
	while(low <= up){
		mid = (low + up) / 2;
		if(x < arr[len[mid]])
			low = mid + 1;
		else
			up = mid - 1;
	}
	return(low);
}

void solve(){
	int length = 0;
	for(int i=n;i>0;i--){
		pos[i] = 0;
		length = BS(1, best, arr[i]);
		if(length > best){
			pos[i] = len[length - 1];
			best = length;
			len[length] = i;
		} else 
			if(length <= best){
				pos[i] = len[length - 1];
				if(arr[i] > arr[len[length]])
					len[length] = i;
			}
	}

}

int main(){
	ifstream cin("scmax.in");
	ofstream cout("scmax.out");
	cin >> n; 
	for(int i=1;i<=n;i++)
		cin >> arr[i];
	solve();
	cout << best << endl;
	for(int i=len[best]; i>0; i=pos[i])
		cout << arr[i] << ' ';
	return(0);
}