Cod sursa(job #751318)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 25 mai 2012 17:03:33
Problema P-sir Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<stdio.h>
#include<algorithm>

#define maxn 2005

using namespace std;

FILE*f=fopen("psir.in","r");
FILE*g=fopen("psir.out","w");

int n,nr;
int v[maxn],N[maxn];
unsigned int aib[maxn][maxn],total[maxn];

inline int cb ( int val ){
	int p = 1,m,u = nr;
	
	while ( p <= u ){
		m = (p + u)>>1;
		if ( N[m] == val )	return m;
		if ( N[m] > val )	u = m - 1;
		else	p = m + 1;
	}
	
	return 0;
}

inline int lsb ( int x ){
	return x & -x;
}

inline void update_aib ( unsigned int *aib , int poz , unsigned int val ){
	
	while ( poz <= nr ){
		aib[poz] += val;
		poz += lsb(poz);
	}
}

inline unsigned int query_aib ( unsigned int *aib , int poz ){
	unsigned int s = 0;
	
	while ( poz > 0 ){
		s += aib[poz];
		poz -= lsb(poz);
	}
	
	return s;
}

int main () {
	
	fscanf(f,"%d",&n);
	for ( int i = 1 ; i <= n ; ++i ){
		fscanf(f,"%d",&v[i]); N[i] = v[i];
	}
	
	sort(N+1,N+n+1);
	for ( int i = 1 ; i <= n ; ++i ){
		if ( N[i] != N[i-1] ){
			N[++nr] = N[i];
		}
	}
	
	for ( int i = 1 ; i <= n ; ++i ){
		v[i] = cb(v[i]);
	}
	
	for ( int i = 2 ; i <= n ; ++i ){
		for ( int j = 1 ; j < i ; ++j ){
			
			unsigned int now = 1;
			if ( v[i] > v[j] ){
				now += total[v[j]] - query_aib(aib[v[j]],v[i]);
			}
			else{
				if ( v[i] < v[j] ){
					now += query_aib(aib[v[j]],v[i]-1);
				}
			}
			
			update_aib(aib[v[i]],v[j],now);
			total[v[i]] += now;
		}
	}
	
	unsigned int sol = 0;
	for ( int i = 1 ; i <= n ; ++i ){
		sol += total[i];
	}
	
	fprintf(g,"%u\n",sol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}