E. Equilibrium
转自大佬的博客
AC Code
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10;
LL a[N],b[N],sum[N],lg[N];
LL maxn[N][30],minn[N][30];
LL query_maxn(int l,int r)
{
int len=lg[r-l+1];
return max(maxn[l][len],maxn[r-(1<<len)+1][len]);
}
LL query_minn(int l,int r)
{
int len=lg[r-l+1];
return min(minn[l][len],minn[r-(1<<len)+1][len]);
}
int main()
{
int n,q;
scanf("%d%d",&n,&q);
lg[0]=-1;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
lg[i]=lg[i/2]+1;
}
for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i]-b[i];
for(int i=1;i<=n;i++)
{
maxn[i][0]=sum[i];
minn[i][0]=sum[i];
}
for(int i=1;i<=lg[n];i++)
{
for(int j=1;j+(1<<i)-1<=n;j++)
{
maxn[j][i]=max(maxn[j][i-1],maxn[j+(1<<(i-1))][i-1]);
minn[j][i]=min(minn[j][i-1],minn[j+(1<<(i-1))][i-1]);
}
}
while(q--)
{
int l,r;
scanf("%d%d",&l,&r);
if(sum[l-1]!=sum[r]) printf("-1\n");
else if(query_maxn(l,r)>sum[l-1]) printf("-1\n");
else printf("%lld\n",sum[l-1]-query_minn(l,r));
}
//system("pause");
return 0;
}