Cod sursa(job #706056)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 5 martie 2012 15:41:30
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
struct normalizare {
	int val,poz;
};
struct subsir {
	int val,valn;
};
normalizare x[100001];
subsir v[100001];
int l[100001],val,poz,a,b,arb[400001],valmax;
inline bool cmp(const normalizare a, const normalizare b)
{
	return a.val<b.val;
}
int maxim(int a, int b)
{
	if(a>=b)
		return a;
	return b;
}
void update(int nod, int st, int dr)
{
	int mij;
	if((a<=st)&&(dr<=b)) {
		if(val>arb[nod])
			arb[nod]=val;
		return;
	}
	if(st==dr)
		return;
	mij=(st+dr)/2;
	if(a<=mij) 
		update(2*nod,st,mij);
	if(mij<b)
		update(2*nod+1,mij+1,dr);
}
void query(int nod, int st, int dr)
{
	int mij;
	if((st<=poz)&&(poz<=dr)&&(valmax<arb[nod]))
		valmax=arb[nod];
	if(st==dr)
		return ;
	mij=(st+dr)/2;
	if(poz<=mij)
		query(2*nod,st,mij);
	else query(2*nod+1,mij+1,dr);
}
int main ()
{
	int n,i,max,c,nr,ultim;
	ifstream f("scmax.in");
	ofstream g("scmax.out");
	f>>n;
	for(i=1;i<=n;i++) {
		f>>v[i].val;
		x[i].val=v[i].val;
		x[i].poz=i;
	}
	f.close();
	sort(x+1,x+n+1,cmp);
	c=0;
	for(i=1;i<=n;i++) {
		if(x[i].val!=x[i-1].val)
			c++;
		v[x[i].poz].valn=c;
	}
	nr=c;
	l[n]=1;
	val=1;
	a=1;
	b=v[n].valn-1;
	update(1,1,n);
	for(i=n-1;i>=1;i--) {
		valmax=0;
		poz=v[i].valn;
		query(1,1,n);
		l[i]=valmax+1;
		b=v[i].valn-1;
		val=l[i];
		update(1,1,n);
	}
	max=0;
	for(i=1;i<=n;i++)
		if(l[i]>max) {
			max=l[i];
			poz=i;
		}
	g<<max<<'\n';
	g<<v[poz].val<<" ";
	max--;
	ultim=poz;
	i=poz+1;
	while((max)&&(i<=n)) {
		if((l[i]==max)&&(v[ultim].val<v[i].val)) {
			g<<v[i].val<<" ";
			max--;
			ultim=i;
		}
		i++;
	}
	g.close();
	return 0;
}