Cod sursa(job #630026)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 4 noiembrie 2011 15:55:40
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<pair<int,int> >V;
void read(),solve(),update(int),afis(int);
int i,n,a,best[100010],AIB[100010],A[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",&a);
		V.push_back(make_pair(a,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(A[SOL[cnt]]>A[i]||!SOL[cnt])SOL[cnt]=i;
		if(cnt>maxim){maxim=cnt;maxpoz=i;dad[i]=SOL[cnt-1];}
		update(A[i]);
	}
	printf("%d\n",maxim);
	afis(maxpoz);
/*	for(;cnt;cnt=dad[cnt])
	{
		vector<pair<int,int> >::iterator it=V.begin();
		printf("%d ",(it+A[cnt]-1)->first);
	}*/
}
void afis(int X)
{
	if(!X)return;
	afis(dad[X]);
	vector<pair<int,int> >::iterator it=V.begin();
	printf("%d ",(it+A[X]-1)->first);
}	
void update(int X)
{
	for(;X<=n;X+=X&(-X))++AIB[X];
}
int query(int X)
{
	int S=0;
	for(;X>0;X-=X&(-X))S+=AIB[X];
	return S;
}