Pagini recente » Cod sursa (job #2023519) | Cod sursa (job #3032252) | Cod sursa (job #1270481) | Cod sursa (job #3126851) | Cod sursa (job #1506967)
#include <stdio.h>
#define MAXN 2000
#define MOD 4294967296
unsigned int d[MAXN][MAXN];
int v[MAXN];
int p[MAXN][MAXN];
unsigned int sum[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 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;
}
void qs(int st, int dr, int l){
int i = st, j = dr, piv = v[p[l][(st + dr) / 2]], aux;
while(i <= j){
while(v[p[l][i]] < piv)
i++;
while(v[p[l][j]] > piv)
j--;
if(i <= j){
aux = p[l][i]; p[l][i] = p[l][j]; p[l][j] = aux;
i++; j--;
}
}
if(st < j)
qs(st, j, l);
if(i < dr)
qs(i, dr, l);
}
int main(){
FILE *in = fopen("psir.in", "r");
int n, i, j;
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];
p[i][0] = 0;
for(j = 1; j < i; j++){
d[i][j] = 1 + interv(j, i);
rez += d[i][j];
p[i][j] = j;
}
qs(0, i - 1, i);
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, "%d", rez);
fclose(out);
return 0;
}