Pagini recente » Cod sursa (job #2613567) | Cod sursa (job #2334592) | Cod sursa (job #158399) | Cod sursa (job #3211538) | Cod sursa (job #493912)
Cod sursa(job #493912)
#include <cstdio>
#include <algorithm>
const int maxN = 2010;
using namespace std;
unsigned int N;
int V[maxN], sorted[maxN], norm[maxN];
unsigned int D[maxN][maxN];
unsigned int aib[maxN][maxN];
inline unsigned int lsb(unsigned int x) {
return ((x & (x - 1)) ^ x);
}
inline void update(unsigned int a, unsigned int poz, unsigned int val) {
unsigned int i;
for (i = poz; i <= N; i += lsb(i))
aib[a][i] += val;
}
inline unsigned int query(unsigned int a, unsigned int poz) {
unsigned int i, ret = 0;
for (i = poz; i > 0; i -= lsb(i))
ret += aib[a][i];
return ret;
}
int main() {
unsigned int i, j, k;
freopen("psir.in", "r", stdin);
freopen("psir.out", "w", stdout);
scanf("%d", &N);
for (i = 1; i <= N; i++) {
scanf("%d", &V[i]);
sorted[i] = V[i];
}
sort(sorted + 1, sorted + N + 1);
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
if (sorted[j] == V[i]) {
norm[i] = j;
break;
}
for (i = 1; i <= N; i++)
D[0][i] = 1;
for (i = 1; i <= N; i++) {
for (j = i + 1; j <= N; j++) {
/* if (V[j] - V[i] < 0) {
// fprintf(stderr, "pula\n");
D[i][j] = query(i, norm[j] - 1);
// fprintf(stderr, "Q aib = %d, poz = %d, val = %d\n", i, norm[j] - 1, D[i][j]);
}
else
D[i][j] = query(i, N) - query(i, norm[j]);
*/
for (k = 1; k < i; k++)
if (((V[j] - V[i]) * (V[j] - V[k]) < 0)) {
D[i][j] += D[k][i];
// fprintf(stderr, "(%d, %d) += (%d, %d) -> %d\n", i, j, k, i, D[i][j]);
}
D[i][j]++;
// update(j, norm[i], D[i][j]);
// fprintf(stderr, "U aib = %d, poz = %d, val = %d\n", j, norm[i], D[i][j]);
}
}
int sol = 0;
for (i = 1; i <= N; i++)
for (j = i + 1; j <= N; j++)
sol += D[i][j];
printf("%d\n", sol);
return 0;
}