Pagini recente » Cod sursa (job #1279091) | Cod sursa (job #2490039) | Cod sursa (job #2820257) | Cod sursa (job #3141729) | Cod sursa (job #1789208)
#include <cstdio>
#include <algorithm>
#define MAXN 2000
unsigned int sum[MAXN+2][MAXN+2];
int v[MAXN+1], a[MAXN+1], fr[MAXN+1], k;
inline int max2(int a, int b){
if(a>b) return a;
else return b;
}
inline int cautbin(int x){
int rez=0;
for(int pas=1<<10; pas; pas>>=1) if((rez+pas<=k)&&(a[rez+pas]<=x)) rez+=pas;
return rez;
}
int main(){
int n;
unsigned int ans, aux;
FILE *fin, *fout;
fin=fopen("psir.in", "r");
fout=fopen("psir.out", "w");
fscanf(fin, "%d", &n);
for(int i=1; i<=n; i++){
fscanf(fin, "%d", &v[i]);
a[i]=v[i];
}
std::sort(a+1, a+n+1);
k=1;
for(int i=2; i<=n; i++) if(a[i]!=a[k]) a[++k]=a[i];
for(int i=1; i<=n; i++) v[i]=cautbin(v[i]);
for(int i=1; i<=n; i++) fr[v[i]]++;
ans=0;
for(int i=1; i<=k; i++) ans+=fr[i]*(fr[i]-1)/2;
for(int i=n; i>0; i--){
sum[i][v[i]]=1;
for(int j=i+1; j<=n; j++){
if(v[i]<v[j]) aux=sum[j][v[i]+1];
else if(v[i]>v[j]) aux=sum[j][v[i]-1];
else aux=0;
sum[i][v[j]]+=aux;
ans+=aux;
}
for(int j=v[i]+1; j<=k; j++) sum[i][j]+=sum[i][j-1];
for(int j=v[i]-1; j>0; j--) sum[i][j]+=sum[i][j+1];
}
fprintf(fout, "%u\n", ans);
fclose(fin);
fclose(fout);
return 0;
}