Cod sursa(job #672663)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 2 februarie 2012 21:22:33
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#define maxim(a,b) a>b?a:b
using namespace std;
vector<pair<int,int> >V;
void read(),solve(),update(int,int),afiseaza(int);
int i,n,a,AIB[100010],A[100010],poz[100010],C[100010],cnt,query(int),maxim,maxpoz,SOL[100010],dad[100010];
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&C[i]);
		V.push_back(make_pair(C[i],i));
	}
}
void solve()
{
	sort(V.begin(),V.end());
	for(vector<pair<int,int> >::iterator it=V.begin();it!=V.end();it++)
		if(it->first!=(it+1)->first)A[it->second]=it-V.begin()+1; //normalizare
	for(i=1;i<=n;i++)
	{
		if(!A[i])continue;
		cnt=query(A[i])+1;
		if(cnt>maxim){maxim=cnt;maxpoz=i;}
		update(A[i],cnt);
	}
	printf("%d\n",maxim);
	afiseaza(maxpoz);
}
void afiseaza(int X)
{
	if(!X)return;
	afiseaza(dad[X]);
	printf("%d ",C[X]);
}
void update(int X,int val)
{
	for(;X<=n;X+=X&(-X))
		if(AIB[X]<val)
		{
			AIB[X]=val;
			poz[X]=i;
		}
		
}
int query(int X)
{
	int S=0,pos=0;
	for(;X>0;X-=X&(-X))//S=maxim(S,AIB[X]);
		if(AIB[X]>S)
		{
			S=AIB[X];
			pos=poz[X];
		}
	dad[i]=pos;
	return S;
}