rt,这道题TLE了,求大佬帮忙看看
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char buf[1<<21],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
void print(long long x) {
if(x>9) print(x/10);
*O++=x%10+'0';
}
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
const int MAXN=1e5+5;
int n,m,l=1,r,kc;
ll sum[MAXN],an,ans[MAXN],a1[MAXN],a2[MAXN],k,s[MAXN][3];
vector<ll> ls;
ll ma[MAXN<<2];
int getid(ll x){return lower_bound(ls.begin(),ls.end(),x)-ls.begin()+1;}
struct qu{
int l,r,lc,rc,id;
}q[MAXN];
bool cmp(qu x,qu y){
return x.lc!=y.lc?x.lc<y.lc:x.lc&1?x.rc<y.rc:x.rc>y.rc;
}
int main(){
n=read(),k=read();
ls.push_back(0);
ls.push_back(k);
ls.push_back(-k);
for(int i=1;i<=n;++i)a1[i]=read();
for(int i=1;i<=n;++i){
a2[i]=read();
if(a1[i]==1){
sum[i]=sum[i-1]+a2[i];
}
else{
sum[i]=sum[i-1]-a2[i];
}
ls.push_back(sum[i]);
ls.push_back(sum[i]+k);
ls.push_back(sum[i]-k);
}
sort(ls.begin(),ls.end());
ls.erase(unique(ls.begin(),ls.end()),ls.end());
for(int i=0;i<=n;++i){
s[i][0]=getid(sum[i]-k);
s[i][1]=getid(sum[i]);
s[i][2]=getid(sum[i]+k);
}
kc=400;
m=read();
for(int i=1;i<=m;++i){
q[i].l=read();
q[i].r=read();
q[i].l--;
q[i].lc=l/kc;
q[i].rc=r/kc;
q[i].id=i;
}
sort(q+1,q+m+1,cmp);
for(int i=1;i<=m;++i){
while(l>q[i].l){
l--;
an+=ma[s[l][2]];
ma[s[l][1]]++;
}
while(r<q[i].r){
r++;
an+=ma[s[r][0]];
ma[s[r][1]]++;
}
while(l<q[i].l){
ma[s[l][1]]--;
an-=ma[s[l][2]];
l++;
}
while(r>q[i].r){
ma[s[r][1]]--;
an-=ma[s[r][0]];
r--;
}
ans[q[i].id]=an;
}
for(int i=1;i<=m;++i)printf("%lld\n",ans[i]);
//while(1);
return 0;
}