Pagini recente » Cod sursa (job #1404574) | Cod sursa (job #2639618) | Cod sursa (job #1206549) | Cod sursa (job #2945262) | Cod sursa (job #1784955)
#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAXN 2050
using namespace std;
int n;
unsigned int din[MAXN][MAXN], pre[MAXN], a[MAXN];
struct elem
{
unsigned int val;
int ind;
bool operator()(elem e, elem f)
{
return e.val < f.val;
}
}p[MAXN];
int src(int val) /// binary search val in p
{
int step, to = 0;
for (step = 1; step <= n; step <<= 1);
for (step; step; step >>= 1)
if (to + step <= n && p[to+step].val <= val)
to += step;
return to;
}
void solve()
{
unsigned int rez = 0;
//for (int i = 2; i <= n; i++)
//din[1][i] = 1, rez++;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
pre[j] = pre[j-1] + din[p[j].ind][i];
}
for (int j = i+1; j <= n; j++) {
din[i][j] = 1;
if (a[i] < a[j])
din[i][j] += pre[n] - pre[src(a[j])];
else if (a[i] > a[j])
din[i][j] += pre[src(a[j]-1)];
rez += din[i][j];
}
}
printf("%u\n", rez);
}
int main()
{
freopen("psir.in", "r", stdin);
freopen("psir.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%u", &a[i]);
p[i].val = a[i];
p[i].ind = i;
}
sort(p+1, p+1+n, elem());
solve();
return 0;
}