Cod sursa(job #708813)

Utilizator andrey932Andrei andrey932 Data 7 martie 2012 11:29:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
#define MAXN 100005
#define zeros(x) (x^(x-1))&x
ifstream fin("scmax.in");
ofstream fout("scmax.out");

struct nod{
	int val;
	int poz;
};
bool comp(nod a, nod b) {
	return (a.val<b.val);
}


nod a[MAXN],aux;
int v[MAXN],n,i,j,k,aib[MAXN],maxim,pozmax,aibdela[MAXN],dela[MAXN],ax,de,rel[MAXN];
vector<int> st;

void citire() {
	fin>>n;
	for(i=1;i<=n;i++) {
		fin>>a[i].val;
		a[i].poz=i;
	}
}
void upd(int val, int poz, int ax) {	
	for(;poz<=n;poz+=zeros(poz)) {
		if (val>aib[poz]) {
			aib[poz]=val;
			aibdela[poz]=ax;
		}
	}
}
int cauta(int poz, int &d) {
	int rez=0;
	d=0;
	for(;poz;poz-=zeros(poz)) {
		if (rez<aib[poz]) {
			rez=aib[poz];
			d=aibdela[poz];
		}
		
	}
	return rez;
}
int main() {
	citire();
	sort(a+1,a+n+1,comp);
	j=0;
	a[0].val=-999999999;
	for(i=1;i<=n;i++) {				
		if (a[i].val!=a[i-1].val) j++;
		v[a[i].poz]=j;
		//cout<<j<<" ";
		rel[j]=a[i].val;
	}
	aib[0]=0;
	for(i=1;i<=n;i++) {
		k=cauta(v[i]-1,de);
		k++;
		dela[i]=de;
		upd(k,v[i],i);
		if (k>maxim) {
			maxim=k;
			pozmax=i;
		}
	}
	fout<<maxim<<"\n";
	while (pozmax>0) {
		st.push_back(pozmax);
		pozmax=dela[pozmax];
	}
	for(i=st.size()-1;i>=0;i--) {
		fout<<rel[v[st[i]]]<<" ";
	}	
	fout<<"\n";
	fout.close();
	return 0;	
}