Cod sursa(job #1698622)

Utilizator ArkinyStoica Alex Arkiny Data 4 mai 2016 21:46:25
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include<fstream>
#include<algorithm>
#include<vector>
#include<string.h>
#include<stack>
using namespace std;



int N;

int v[100010], aib[100010], l[100010], D[100010], up[100010], o[100010], sz;
stack<int> stk;
void update(int x, int v)
{
	for (;x <= N;x += x&(-x))
		if (D[aib[x]] < D[v])
			aib[x] = v;
}

int query(int x)
{
	int mx = 0;

	for (;x;x -= x&(-x))
		if (D[aib[x]]>D[mx])
			mx = aib[x];
	return mx;
}


FILE *in,*out;

#define DIM 100000
char buff[DIM];
int poz = 0;

void citeste(int &numar)
{
	//cat timp caracterul din buffer nu e cifra ignor      
	while (buff[poz] < '0' || buff[poz] > '9')
		//daca am "golit" bufferul atunci il umplu
		if (++poz == DIM)
			fread(buff, 1, DIM, in), poz = 0;
	//cat timp dau de o cifra recalculez numarul          
	while ('0' <= buff[poz] && buff[poz] <= '9')
	{
		numar = numar * 10 + buff[poz] - '0';
		if (++poz == DIM)
			fread(buff, 1, DIM, in), poz = 0;
	}
}


int main()
{
	in = fopen("scmax.in", "r");
	out = fopen("scmax.out", "w");

	fread(buff, 1, DIM, in), poz = 0;

	citeste(N);

	for (int i = 1; i <= N;++i)
	{
		int numar = 0;
		while (buff[poz] < '0' || buff[poz] > '9')
			//daca am "golit" bufferul atunci il umplu
			if (++poz == DIM)
				fread(buff, 1, DIM, in), poz = 0;
		//cat timp dau de o cifra recalculez numarul          
		while ('0' <= buff[poz] && buff[poz] <= '9')
		{
			numar = numar * 10 + buff[poz] - '0';
			if (++poz == DIM)
				fread(buff, 1, DIM, in), poz = 0;
		}
		v[i]=numar, o[i] = l[i] = v[i];
	}

	sort(v + 1, v + N + 1);

	sz = 1;

	for (int i = 2;i <= N;++i)
		if (v[sz] != v[i])
			v[++sz] = v[i];

	for (int i = 1;i <= N;++i)
		l[i] = lower_bound(v + 1, v + sz + 1, l[i]) - v;

	for (int i = 1;i <= N;++i)
	{
		up[i] = query(l[i]-1);
		D[i] = D[up[i]] + 1;
		update(l[i], i);
	}

	int mx = -1, p;

	for (int i = 1;i <= N;++i)
		if (D[i] > mx)
			mx = D[i], p = i;

	fprintf(out,"%d\n", D[p]);

	while (p)
		stk.push(o[p]), p = up[p];

	while (stk.size())
		fprintf(out,"%d ",stk.top()),stk.pop();

	return 0;
}