E1还是比较简单的

由于每个合法区间必定包含m

把m左边看成一块,m右边看成一块

预处理前面一部分和后面一部分的大于小于m的个数差

比如前面有x个数比m大,那么就要求后面有-x数比m大

当然,后面有-x+1个数比m大也行

可以用数组统计,但是我太傻了,用的树状数组

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=4e5+10;
int n,m,a[maxn],ans,sumn[maxn];
int lowbit(int x){
	return x&(-x);
}
void add(int x){
	for(;x<=400000;x+=lowbit(x))	sumn[x]++;
}
int ask(int x){
	int ans=0;
	for(;x;x-=lowbit(x) )	ans+=sumn[x];
	return ans;
}
int query(int l){
	return ask(l)-ask(l-1);
}
signed main()
{
	cin >> n >> m;
	int num=0;
	for(int i=1;i<=n;i++)
	{
		cin >> a[i];
		if( a[i]==m )	num=i;
	}
	int zhi=0;
	for(int i=num-1;i>=1;i--)
	{
		if( a[i]>m )	zhi++;
		else	zhi--;
		if( zhi==0||zhi==1 )	ans++;//相差0或1也可以 
		add( zhi+200000 );
	}
	zhi=0;
	for(int i=num+1;i<=n;i++)
	{
		if( a[i]>m )	zhi++;
		else	zhi--;
		if( zhi==0||zhi==1 )	ans++;
		ans+=query(-zhi+200000)+query(-zhi+200001);
	}
	cout << ans+1;//加上单独的m一种 
}