直接模拟即可。
#include<bits/stdc++.h>
using namespace std;
int n,m,k,sum;
int a[300005];
long long l,r,cnt=0;
int main()
{
cin>>n>>m>>k;
for(int i=1; i<=n; i++)
{
cin>>a[i];
if(a[i]>=(-1*k)&&a[i]<=k)//我们把一开始在范围内的人用 sum 先记录下来
sum++;
}
sort(a+1,a+1+n);//开始按从小到大排序
l=1,r=n;
for(int i=1; i<=m; i++)
{
int op,x;
cin>>op;//输入询问的种类
if(1==op)//右移 x
{
cin>>x;
cnt+=x;//cnt 表示当前到底移动了多少(例如,cnt 为 -2 表示所有人左移 2 格)
while(r>=l&&a[r]+cnt>k)//越界了且移动后超过界限(因为向右移只会动右边界)
{
sum--;//直接减掉
r--;//右边界 --
}
}
else if(2==op)//左移 x
{
cin>>x;
cnt-=x;
while(l<=r&&a[l]+cnt<(-1*k))//越界了且移动后超过界限(因为向左移只会动左边界)
{
sum--;//直接减掉
l++;//左边界 ++
}
}
else if(3==op)//询问
cout<<sum<<endl;//最后结果输出
}
return 0;
}