虽然已经过了但不知道为什么那么调QAQ
// LUOGU_RID: 135434796
#include<bits/stdc++.h>
const int N=100010;
int n,m,k;
int a[N],t[N];
long long pre[N];
struct Query{
int l,r,id;
}q[N];
int block;
int get(int x){return (x-1)/block+1;}
bool cmp1(const Query &a,const Query &b){
int al=get(a.l),bl=get(b.l);
if(al!=bl)return al<bl;
if(al&1)return a.r<b.r;
return a.r>b.r;
}
int askl[N],askr[N],val[N];
int cnt[N*4];
long long res=0;
void addl(int pos){
res+=cnt[askl[pos]];
cnt[val[pos]]+=1;
}
void addr(int pos){
res+=cnt[askr[pos]];
cnt[val[pos]]+=1;
}
void dell(int pos){
cnt[val[pos]]-=1;
res-=cnt[askl[pos]];
}
void delr(int pos){
cnt[val[pos]]-=1;
res-=cnt[askr[pos]];
}
long long ans[N];
int main(){
std::ios::sync_with_stdio(false),std::cin.tie(nullptr);
std::vector<long long>nums;
nums.emplace_back(0);
nums.emplace_back(-k);
nums.emplace_back(k);
std::cin>>n>>k;
for(int i=1;i<=n;++i)std::cin>>t[i];
for(int i=1;i<=n;++i)std::cin>>a[i];
for(int i=1;i<=n;++i){
pre[i]=(long long)a[i]*(t[i]==1?1:-1);
pre[i]+=pre[i-1];
nums.emplace_back(pre[i]);
nums.emplace_back(pre[i]-k);
nums.emplace_back(pre[i]+k);
}
std::sort(nums.begin(),nums.end());
nums.erase(std::unique(nums.begin(),nums.end()),nums.end());
for(int i=0;i<=n;++i)val[i]=std::lower_bound(nums.begin(),nums.end(),pre[i])-nums.begin();
for(int i=0;i<=n;++i)askl[i]=std::lower_bound(nums.begin(),nums.end(),pre[i]+k)-nums.begin();
for(int i=0;i<=n;++i)askr[i]=std::lower_bound(nums.begin(),nums.end(),pre[i]-k)-nums.begin();
std::cin>>m;
for(int i=1;i<=m;++i){
std::cin>>q[i].l>>q[i].r;
q[i].id=i;
}
block=std::sqrt(n);
std::sort(q+1,q+1+m,cmp1);
int L=1,R=0;
for(int i=1;i<=m;++i){
int l=q[i].l-1,r=q[i].r,id=q[i].id;
while(L>l)addl(--L);
while(R<r)addr(++R);
while(L<l)dell(L++);
while(R>r)delr(R--);
ans[id]=res;
}
for(int i=1;i<=m;++i)std::cout<<ans[i]<<'\n';
return 0;
}
把
for(int i=0;i<=n;++i)val[i]=std::lower_bound(nums.begin(),nums.end(),pre[i])-nums.begin();
for(int i=0;i<=n;++i)askl[i]=std::lower_bound(nums.begin(),nums.end(),pre[i]+k)-nums.begin();
for(int i=0;i<=n;++i)askr[i]=std::lower_bound(nums.begin(),nums.end(),pre[i]-k)-nums.begin();
改成
for(int i=0;i<=n;++i)val[i]=std::lower_bound(nums.begin(),nums.end(),pre[i])-nums.begin()+1;
for(int i=0;i<=n;++i)askl[i]=std::lower_bound(nums.begin(),nums.end(),pre[i]+k)-nums.begin()+1;
for(int i=0;i<=n;++i)askr[i]=std::lower_bound(nums.begin(),nums.end(),pre[i]-k)-nums.begin()+1;
就过了