rt,函数到底哪里写错了,一直RE
#include<iostream>
#include<cstdio>
#define ll long long
#define lson root<<1
#define rson root<<1|1
using namespace std;
int p;
const int maxn=100005;
ll a[maxn];
struct node{
ll v,mul,add;
}st[maxn<<2];
void build(int root,int l,int r){
st[root].mul=1;
st[root].add=0;
if(l==r)st[root].v=a[l];
else {
int mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
st[root].v=st[root*2].v+st[root*2+1].v;
}
st[root].v%=p;
return;
}
void pushdown(int root,int l,int r){
int mid=(l+r)>>1;
st[lson].v=(st[lson].v*st[root].mul+st[root].add*(mid-l+1))%p;
st[rson].v=(st[rson].v*st[root].mul+st[root].add*(r-mid))%p;
st[lson].mul=(st[lson].mul*st[root].mul)%p;
st[rson].mul=(st[rson].mul*st[root].mul)%p;
st[lson].add=(st[lson].add*st[root].mul+st[root].add)%p;
st[rson].add=(st[rson].add*st[root].mul+st[root].add)%p;
st[root].mul=1;
st[root].add=0;
return;
}
void mulit(int root,int strl,int strr,int l,int r,ll k){
if(r<strl||strr<l)return;
if(l<=strl&&strr<=r)
{
st[root].v=(st[root].v*k)%p;
st[root].mul=(st[root].mul*k)%p;
st[root].add=(st[root].add*k)%p;
return;
}
pushdown(root,strl,strr);
int mid=(strl+strr)>>1;
mulit(lson,strl,mid,l,r,k);
mulit(rson,mid+1,strr,l,r,k);
st[root].v=(st[lson].v+st[rson].v)%p;
return;
}
void addit(int root,int strl,int strr,int l,int r,ll k){
if(strl>r||strr<l)return;
if(strl>=l&&strr<=r)
{
st[root].add=(st[root].add+k)%p;
st[root].v=(st[root].v+k*(strr-strl+1))%p;
return;
}
pushdown(root,strl,strr);
int mid=(strr+strl)>>1;
addit(lson,strl,mid,l,r,k);
addit(rson,mid+1,strr,l,r,k);
st[root].v=(st[lson].v+st[rson].v)%p;
return;
}
ll query(int root,int strl,int strr,int l,int r){
if(strl>r||strr<l)return 0;
if(l<=strl&&r<=strr)
{
return st[root].v;
}
pushdown(root,strl,strr);
int mid=(strr+strl)>>1;
return (query(lson,strl,mid,l,r)+query(rson,mid+1,strr,l,r))%p;
}