Cod sursa(job #917467)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 17 martie 2013 22:20:27
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#define NMAX 100100

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, sol, poz;
int a[NMAX], v[NMAX], no[NMAX];
int aib[NMAX], scmax[NMAX];

inline int bsNorm(int left, int right, int number)
{
	if (left == right) return left;
	int mid = (left + right) >> 1;
	if (number <= v[mid]) return bsNorm(left, mid, number);
	if (number > v[mid])  return bsNorm(mid + 1, right, number);
}

inline int query(int value)
{
	int ret = 0;
	for (int i = value; i >= 1; i = i & (i - 1))
		ret = max(ret, aib[i]);
	return ret;
}

inline void update(int position, int value)
{
	for (int i = position; i <= NMAX; i = (i | (i - 1)) + 1)
		aib[i] = max(aib[i], value);
}

inline void makeSol(int position)
{
	for (int i = position; i >= 1; i--)
		if (a[i] < a[position] && scmax[i] + 1 == scmax[position])
		{
			makeSol(i);
			break;
		}
	fout << no[position] << ' ';
}

int main()
{
	fin >> n;
	for (int i = 1; i <= n; i++)
		fin >> a[i], v[i] = a[i], no[i] = a[i];
	sort(v + 1, v + n + 1);
	for (int i = 1; i <= n; i++)
		a[i] = bsNorm(1, n, a[i]);
	
	for (int i = 1; i <= n; i++)
	{
		scmax[i] = query(a[i] - 1) + 1;
		update(a[i], scmax[i]);
		if (sol < scmax[i])
			sol = scmax[i], poz = i;
	}
	
	fout << sol << '\n';
	makeSol(poz);
}