Pagini recente » Cod sursa (job #3132803) | Cod sursa (job #2106077) | Borderou de evaluare (job #804527) | Cod sursa (job #2553002) | Cod sursa (job #67377)
Cod sursa(job #67377)
#include <stdio.h>
#include <set>
using namespace std;
#define NMax 2005
int N, v[NMax], norm[NMax], h = 0;
unsigned int D[NMax][NMax], SUM[NMax][NMax], cnt = 0;
set<int> A;
int BS(int X)
{
int l, r, m;
l = 1; r = h;
while (l <= r)
{
m = (l + r) / 2;
if (norm[m] < X) l = m+1;
else if (norm[m] > X) r = m-1;
else return m;
}
return -1; // should never arrive here
}
int main(void)
{
int i, j, k;
set<int>::iterator it;
freopen("psir.in", "r", stdin);
freopen("psir.out", "w", stdout);
scanf("%d", &N);
for (i = 1; i <= N; i++)
scanf("%d", &v[i]);
for (i = 1; i <= N; i++)
A.insert(v[i]);
for (it = A.begin(); it != A.end(); it++)
norm[++h] = *it;
for (i = 1; i <= N; i++)
v[i] = BS(v[i]);
for (i = 1; i <= N; i++)
{
for (j = 1; j < i; j++)
D[v[j]][v[i]]++;
for (j = 1; j < v[i]; j++)
D[j][v[i]] += SUM[N][j] - SUM[v[i]][j];
for (j = v[i]+1; j <= N; j++)
D[j][v[i]] += SUM[v[i]-1][j];
// actualizam
for (j = 1; j <= N; j++)
SUM[j][v[i]] = SUM[j-1][v[i]] + D[j][v[i]];
}
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
cnt += D[i][j];
printf("%u\n", cnt);
return 0;
}