Cod sursa(job #486555)

Utilizator ProtomanAndrei Purice Protoman Data 21 septembrie 2010 22:58:46
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <algorithm>
#include <stdio.h>

#define MAX 2048
#define ll long long

using namespace std;

ll n, rez;
ll x[MAX], v[MAX];
ll sum[MAX];
unsigned int sol[MAX][MAX];

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

	scanf("%lld", &n);

	for (int i = 1; i <= n; v[i] = x[i], i++)
		scanf("%lld", &x[i]);

	sort(v + 1, v + 1 + n);

	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			if (v[j] == x[i])
			{
				x[i] = j;

				break;
			}

	ll restRez = ((ll) 1 << 32);
	for (int i = 1; i <= n; i++)
	{
		memset(sum, 0, sizeof(sum));

		for (int j = 1; j < i; j++)
			sum[x[j]] = (sum[x[j]] + (ll) sol[j][i]) % restRez;

		for (int j = 1; j <= x[i]; j++)
			sum[j] = (sum[j] + sum[j - 1]) % restRez;
		for (int j = n; j >= x[i]; j--)
			sum[j] = (sum[j] + sum[j + 1]) % restRez;

		for (int j = i + 1; j <= n; j++)
		{
			sol[i][j] = 1;
			if (x[j] < x[i])
				sol[i][j] += sum[x[j] - 1];
			else if (x[j] > x[i])
				sol[i][j] += sum[x[j] + 1];

			sol[i][j] %= restRez;

			rez = (rez + sol[i][j]) % restRez; 
		}
	}

	printf("%lld\n", rez);

	fclose(stdin);
	fclose(stdout);
	return 0;
}