Cod sursa(job #633696)

Utilizator nandoLicker Nandor nando Data 14 noiembrie 2011 16:13:07
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <map>
using namespace std;

fstream fin("scmax.in", ios::in);
fstream fout("scmax.out", ios::out);

#define MAXN 100100
#define zero(x) (x ^ (x - 1) & x)
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))

int n, nr;
int a[MAXN], len[MAXN], prev[MAXN], tata[MAXN];

int query (int p)
{
	int beg = 0, end = nr;
	
	while (beg <= end) {
		int mdl = beg + ((end - beg) >> 1);
		
		if (a[tata[mdl]] < p && p <= a[tata[mdl + 1]]) {
			return mdl;
		}
		
		if (a[tata[mdl + 1]] < p) {
			beg = mdl + 1;
		} else {
			end = mdl - 1;
		}
	}
	
	return nr;
}

void recover (int i)
{
	if (prev[i] > 0) {
		recover(prev[i]);	
	}	
	fout << a[i] << " ";
}

int main()
{
	fin >> n;
	
	for (int i = 1; i <= n; ++i) {
		fin >> a[i];
	}
	
	len[1] = 1, tata[1] = 1, tata[0] = 0, nr = 1;
	
	int maxp = 1;
	for (int i = 2; i <= n; ++i) {
		int j = query (a[i]);
		len[i] = j + 1;
		prev[i] = tata[j];
		tata[j + 1] = i;
		
		nr = max(j + 1, nr);
		
		if (len[i] > len[maxp]) {
			maxp = i;	
		}
	}
		
	fout << len[maxp] << endl;
	recover(maxp);
		
	fin.close();
	fout.close();
	return 0;   
}