Cod sursa(job #1460729)

Utilizator ArkinyStoica Alex Arkiny Data 13 iulie 2015 18:11:11
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<fstream>
#include<algorithm>
using namespace std;
#define MAX 100001

int lst[MAX],v[MAX],R[MAX],AIB[MAX],pos[MAX],D[MAX],N,i;

ifstream in("scmax.in");
ofstream out("scmax.out");

int query(int x)
{
	int mx=0;
	for(;x;x-=x&(-x))
		if(D[AIB[x]] > D[mx])
			mx=AIB[x];
	return mx;

}

void update(int x,int e)
{
	int mx=0;
	for(;x<=N;x+=x&(-x))
		if(D[e]>D[AIB[x]])
			AIB[x]=e;
}

int main()
{
	in>>N;
	for(i=1;i<=N;i++)
		in>>lst[i],R[i]=lst[i];

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

	int l=1;

	for(i=2;i<=N;i++)
		if(lst[l]!=lst[i])
			lst[++l]=lst[i];
	for(i=1;i<=N;i++)
		v[i]=lower_bound(lst + 1,lst + l + 1 ,R[i]) -lst;
	
	for(i=1;i<=N;i++)
	{
		pos[i]=query(v[i]-1);
		D[i]=1 + D[pos[i]];
		update(v[i],i);
	}
	int mx=0;
	for(i=1;i<=N;i++)
		if(D[i]>D[mx])
			mx=i;
	int j=0;
	for(l=mx;l;l=pos[l])
		lst[++j]=R[l];

	out<<D[mx]<<'\n';

	for(l=j;j;--j)
		out<<lst[j]<<' ';

	return 0;
}