Pagini recente » Cod sursa (job #1403892) | Cod sursa (job #3256033) | Cod sursa (job #196591) | Cod sursa (job #1780496) | Cod sursa (job #1784286)
#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAXN 2050
using namespace std;
int n, a[MAXN];
int din[MAXN][MAXN], pre[MAXN];
struct elem
{
int val, 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()
{
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("%d\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("%d", &a[i]);
p[i].val = a[i];
p[i].ind = i;
}
sort(p+1, p+1+n, elem());
solve();
return 0;
}