Cod sursa(job #708804)

Utilizator andrey932Andrei andrey932 Data 7 martie 2012 11:05:23
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <fstream>
#include <algorithm>
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,dela[MAXN],ax;

void citire() {
	fin>>n;
	for(i=1;i<=n;i++) {
		fin>>a[i].val;
		a[i].poz=i;
	}
}
void upd(int val, int poz) {
	ax=poz;
	for(;poz<=n;poz+=zeros(poz)) {
		if (val>aib[poz]) {
			aib[poz]=val;
			dela[poz]=ax;
		}
	}
}
int cauta(int poz) {
	int rez=0;
	for(;poz>0;poz-=zeros(poz)) {
		rez=max(rez,aib[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;
	}
	aib[0]=0;
	for(i=1;i<=n;i++) {
		k=cauta(v[i]-1);
		k++;
		upd(k,v[i]);
		if (k>maxim) {
			maxim=k;
			pozmax=i;
		}
	}
	fout<<maxim<<"\n";
	cout<<pozmax;
	fout.close();
	return 0;	
}