Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Statistici Andrei Ungureanu (andrei090498) | Cod sursa (job #202353)
Cod sursa(job #202353)
#include <stdio.h>
#include <set>
using namespace std;
#define NMax 2005
int N, v[NMax], norm[NMax], h = 0;
unsigned int SUM[NMax][NMax], X[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;
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 <= N; j++) X[j] = 0;
for (j = 1; j < i; j++)
X[v[j]]++;
for (j = 1; j < v[i]; j++)
X[j] += SUM[N][j] - SUM[v[i]][j];
for (j = v[i]+1; j <= N; j++)
X[j] += SUM[v[i]-1][j];
for (j = 1; j <= N; j++)
X[j] += X[j-1];
// actualizam
for (j = 1; j <= N; j++)
SUM[j][v[i]] += X[j];
}
for (i = 1; i <= N; i++)
cnt += SUM[N][i];
printf("%u\n", cnt);
return 0;
}