传送门
我们可以将大于b的数看成1,小于的看成-1
然后题目就变成了求有多少个在d之前的前缀与在d之后的后缀互为相反数。
显然可以O(N)预处理O(N)询问。
然后就水过去啦。
var
a,b:array [-100005..100005] of int64;
n,q,i,bb,x:longint;
ans:int64;
begin
read(n,bb); q:=0;
for i:=1 to n do begin
read(x);
if (x<bb) then a[i]:=-1
else if (x>bb) then a[i]:=1
else q:=i;
end;
for i:=1 to n do a[i]:=a[i]+a[i-1];
for i:=0 to q-1 do inc(b[a[i]]);
ans:=0;
for i:=q to n do ans:=ans+b[a[i]];
write(ans);
end.