提交时间:2023-08-14 12:21:13

运行 ID: 98134

#include<bits/stdc++.h> using namespace std; long long a[1000005],t[1000005],p; inline void pushup(int now){ t[now]=(t[now<<1]+t[now<<1|1])%p; } void build(int now,int l,int r){ if(l==r){ t[now]=a[l]; return; } int mid=(l+r)>>1; build(now<<1,l,mid); build(now<<1|1,mid+1,r); pushup(now); } long long query(int l,int r,int now,int nl,int nr){ if(l==nl && r==nr) return t[now]; int mid=(nl+nr)>>1; if(r<=mid) return query(l,r,now<<1,nl,mid); else if(l<=mid) return (query(l,mid,now<<1,nl,mid)+query(mid+1,r,now<<1|1,mid+1,nr))%p; else return query(l,r,now<<1|1,mid+1,nr); } int main(){ int n,m; scanf("%d%d%lld",&n,&m,&p); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); build(1,1,n); for(int i=1;i<=m;i++){ int l,r; scanf("%d%d",&l,&r); printf("%lld\n",query(l,r,1,1,n)); } return 0; }