第一个测试点输入:
8 10 571373
5929 7152 8443 6028 8580 5449 8473 4237
2 4 8 4376
1 2 8 9637
2 2 6 7918
2 5 8 5681
3 2 8
1 1 5 6482
3 1 5
1 5 8 8701
2 5 8 7992
2 5 8 7806
输出
478836
562114
我的代码本机上测是这个结果,但获得了0tp
My Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int P=571373;
const int N=1e5+7;
int a[N];
struct node{
ll sum,lazy_add,lazy_mul;
}tree[N<<2];
inline int left_son(int u){return u<<1;}
inline int right_son(int u){return u<<1|1;}
inline bool inrange(int l,int r,int L,int R){return (L<=l)&&(r<=R);}
inline void add_sum(int u){tree[u].sum=(tree[left_son(u)].sum+tree[right_son(u)].sum)%P;}
void build_tree(int u,int l,int r){
tree[u].lazy_add=0;
tree[u].lazy_mul=1;
if(l==r){tree[u].sum=a[l]%P;return;}
int m=(l+r)>>1;
build_tree(left_son(u),l,m);
build_tree(right_son(u),m+1,r);
add_sum(u);
}
void f(int u,int l,int r,int _mul,int _add){
tree[u].sum=(tree[u].sum*_mul%P+(_add*(r-l+1))%P)%P;
tree[u].lazy_add=(tree[u].lazy_add*_mul%P+_add)%P;
tree[u].lazy_mul*=_mul%P;
}
void add_lazy(int u,int l,int r){
int m=(l+r)>>1;
f(left_son(u),l,m,tree[u].lazy_mul,tree[u].lazy_add);
f(right_son(u),m+1,r,tree[u].lazy_mul,tree[u].lazy_add);
tree[u].lazy_add=0;
tree[u].lazy_mul=1;
}
void add(int u,int l,int r,int L,int R,int _mul,int _add){
if(inrange(l,r,L,R)){
f(u,l,r,_mul,_add);
return;
}
add_lazy(u,l,r);
int m=(r+l)>>1;
if(L<=m) add(left_son(u),l,m,L,R,_mul,_add);
if(R>m) add(right_son(u),m+1,r,L,R,_mul,_add);
add_sum(u);
}
ll query(int u,int l,int r,int L,int R){
if(inrange(l,r,L,R)) return tree[u].sum;
ll tmp=0;
int m=(l+r)>>1;
add_lazy(u,l,r);
if(L<=m) tmp+=query(left_son(u),l,m,L,R);
if(R>m) tmp+=query(right_son(u),m+1,r,L,R);
return tmp%P;
}
int n,m,p;
int main(){
//freopen("1.txt","w",stdout);
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build_tree(1,1,n);
while(m--){
ll opt,l,r,k;
scanf("%d",&opt);
if(opt==1){
scanf("%lld%lld%lld",&l,&r,&k);
add(1,1,n,l,r,k,0);
}
if(opt==2){
scanf("%lld%lld%lld",&l,&r,&k);
add(1,1,n,l,r,1,k);
}
if(opt==3){
scanf("%lld%lld",&l,&r);
printf("%lld\n",query(1,1,n,l,r));
}
}
return 0;
}
蒟蒻求助dalao