Cod sursa(job #227467)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 4 decembrie 2008 18:45:01
Problema Order Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <stdio.h>

long long N, v[100005], arb[1000000], arb2[1000000], arb3[1000000], val, pos;
long long s, S;

long long min(long long x, long long y) { return x < y ? x : y;}

void build(long long nod, long long st, long long dr)
{
	long long m = (st + dr) / 2;
	if (st == dr)
	{
		arb[nod] = val;
		arb2[nod] = pos;
	}
	else
	{
	
		if (pos <= m) build(2 * nod, st, m);
		else build(2 * nod + 1, m + 1, dr);
	

		if (arb[2 * nod] + arb3[2 * nod] <= arb[2 * nod + 1] + arb3[2 * nod + 1] || !arb[2 * nod + 1])
		{
			arb[nod] = arb[2 * nod] + arb3[2 * nod];
			arb2[nod] = arb2[2 * nod];
		}
		else 
		{
			arb[nod] = arb[2 * nod + 1] + arb3[2 * nod + 1];
			arb2[nod] = arb2[2 * nod + 1];
		}	
	}
}

void update(long long nod, long long st, long long dr, long long l, long long r)
{
	long long m = (st + dr) / 2;

	if (l <= st && dr <= r)
	{
		arb3[nod] += val;		
	}
	else
	{
		if (r < dr && r >= st) 
		{
			update(2 * nod, st, m, l, r);
			update(2 * nod + 1, m + 1, dr, l, r);
		}
	}
}
	


int main()
{
	freopen("biscuiti.in","r",stdin);
	freopen("biscuiti.out","w",stdout);

	long long i;
	scanf("%lldd",&N);
	for (i = 1; i <= N; i++)
	{
		scanf("%lldd",&v[i]);
		s += v[i]; val = v[i]; pos = i;
		build(1,1,N);
	}

	for (i = 1; i <= N; i++)
	{
		S += arb[1] + arb3[1];
	//	arb3[1] = 0;
		pos = arb2[1];

		val = i;
		update(1,1,N,1,pos);
		val = (1<<30);
		build(1,1,N);
		
	}
	printf("%lld",S - s);
	return 0;
}