Cod sursa(job #222083)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 19 noiembrie 2008 23:19:08
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

const int N_MAX = 100010;

pair <int, int> v[N_MAX];
int aib[N_MAX], mxpoz[N_MAX], din[N_MAX], prec[N_MAX], vec[N_MAX], sol[N_MAX];
int rez, pz, N;

inline int MAX(int a, int b)
{
	return (a > b ? a : b);
}

int tata(int x)
{
	return x + (x ^ (x & (x - 1)));
}

void update(int poz, int val, int init)
{
	while (poz <= N) {
		if (val > aib[poz]) {
			aib[poz] = val;
			mxpoz[poz] = init;
		}
		poz = tata(poz);
	}
}

void query(int poz)
{
	while (poz > 0) {
		if (aib[poz] > rez) {
			rez = MAX(rez, aib[poz]);
			pz = mxpoz[poz];
		}
		poz = poz & (poz - 1);
	}
}

int cmp(pair <int, int> a, pair <int, int> b)
{
	if (a.first != b.first) return (a.first < b.first);
	else return (a.second > b.second);
}

int main()
{
	freopen("scmax.in", "r", stdin);
#ifndef _SCREEN_
	freopen("scmax.out", "w", stdout);
#endif

	int x;
	scanf("%d\n", &N);
	for (int i = 1; i <= N; i ++) {
		scanf("%d ", &x);
		vec[i] = x;
		v[i] = make_pair(x, i); 
	}

	sort(v + 1, v + N + 1, cmp);
	din[v[1].second] = 1;
	prec[v[1].second] = 0;
	update(v[1].second, 1, v[1].second);

	for (int i = 2; i <= N; i ++) {
//		if (v[i].first != v[i - 1].first) {
			rez = 0, pz = 0;
			if (v[i].second - 1 >= 1) query(v[i].second - 1);
			else rez = 0, pz = 0;
//			printf("rez = %d pz = %d\n", rez, pz);
			din[v[i].second] = rez + 1;
			prec[v[i].second] = pz;
//			printf("%d %d %d\n", v[i].second, din[v[i].second], v[i].second);
		   	update(v[i].second, din[v[i].second], v[i].second);
//		}
	}
//	printf("!!%d\n", din[130]);

	int fin = 0, ult = 0;
	for (int i = 1; i <= N; i ++) {
		if (din[i] > fin) {
			fin = din[i];
			ult = i;
		}
	}

	printf("%d\n", fin);
	while (ult != 0) {
		sol[++ sol[0]] = vec[ult];
		ult = prec[ult];
	}
	for (int i = sol[0]; i >= 1; i --) printf("%d ", sol[i]);
	printf("\n");

	return 0;
}