Pagini recente » Cod sursa (job #563985) | Cod sursa (job #2645599) | Cod sursa (job #2751549) | Cod sursa (job #1264098) | Cod sursa (job #1506974)
#include <stdio.h>
#define MAXN 2000
unsigned int d[MAXN][MAXN];
int v[MAXN];
int p[MAXN][MAXN];
inline int caut(int l, int x){
int i = -1, pas;
for(pas = (1 << 10); pas > 0; pas >>= 1){
if(l > i + pas && v[p[l][i + pas]] < x)
i += pas;
}
return i;
}
inline unsigned int interv(int x, int y){
int a;
if(v[x] < v[y]){
a = caut(x, v[y] + 1);
if(a != -1)
return d[x][p[x][x - 1]] - d[x][p[x][a]];
}
else if(v[x] > v[y]){
a = caut(x, v[y]);
if(a != -1)
return d[x][p[x][a]];
}
return 0;
}
int main(){
FILE *in = fopen("psir.in", "r");
int n, i, j, k;
fscanf(in, "%d", &n);
for(i = 0; i < n; i++)
fscanf(in, "%d", &v[i]);
fclose(in);
unsigned int rez = 0;
for(i = 1; i < n; i++){
d[i][0] = 1;
rez += d[i][0];
for(j = 1; j < i; j++){
d[i][j] = 1 + interv(j, i);
rez += d[i][j];
}
for(j = 0; j < i - 1; j++)
p[i][j] = p[i - 1][j];
j = 0;
while(j < i - 1 && v[i - 1] > v[p[i][j]])
j++;
for(k = i - 1; k > j; k--)
p[i][k] = p[i][k - 1];
p[i][j] = i - 1;
for(j = 1; j < i; j++)
d[i][p[i][j]] += d[i][p[i][j - 1]];
}
FILE *out = fopen("psir.out", "w");
fprintf(out, "%u", rez);
fclose(out);
return 0;
}