rt
#include<bits/stdc++.h>
using namespace std;
int st[500010][25];
int a[500010],b[500010];
int nxt[500010];
int lst[500010];//上一个出现在哪里
int head[500010];
int cnt[500010];
int n;
void Init(){
int lg=log2(1+n);
for(int i=1;i<=n;i++){
st[i][0]=a[i];
}
for(int j=1;j<=lg;j++){
for(int i=1;i<=n;i++)if(i+(1<<j)-1<=n){
st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
}
/*构建一条链记录nxt[i]*/
for(int i=n;i>=1;i--){
if(!lst[a[i]]){
nxt[i]=-1;
lst[a[i]]=i;
}
else{
nxt[i]=lst[a[i]];
lst[a[i]]=i;
}
}
for(int i=1;i<=n;i++){
if(!head[a[i]]){
head[a[i]]=i;
}
}
return;
}
int Max(int l,int r){
int lg=log2(r-l+1);
int ans=max(st[l][lg],st[r-(1<<lg)+1][lg]);
return ans;
}
long long C(int n,int m){
long long ans=(n*(n-1))/2;
return ans;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=abs(a[i]);
}
sort(b+1,b+n+1);
int m=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++){
a[i]=lower_bound(b+1,b+m+1,abs(a[i]))-b;
}
Init();
long long ret=0;
for(int i=1;i<=m;i++){
int l=0,r=0;
cnt[i]=1;
long long sum=1;
for(int j=head[i];nxt[j]!=-1;j=nxt[j]){
//cout<<j<<" ";
l=j;
r=nxt[j];
int ans=Max(l,r);
if(!(ans^i)){
sum++;
}
else{
if(!b[i]){
long long ans=C(sum,2);
ret+=ans;
sum=1;
continue;
}
if(sum==1){
continue;
}
long long x=sum/2ll;
long long y=sum-x;
long long ans=C(x,2)+C(y,2);
ret+=ans;
sum=1;
}
}
cout<<endl;
if(sum==1){
continue;
}
if(!b[i]){
long long ans=C(sum,2);
ret+=ans;
continue;
}
long long x=sum/2ll;
long long y=sum-x;
long long ans=C(x,2)+C(y,2);
ret+=ans;
}
printf("%lld\n",ret);
return 0;
}