m<10^6,m*m才10^12,我在每次运算之后都使用取余符号为什么不开long long还是会错?(开long long之后已过)
#include<bits/stdc++.h>
using namespace std;
const long long int md=571373;
long long int n,q,tp,nm[500005],op,opn,t,tt;
struct p{
long long int s,c,j,r,l;
}tr[500005];
void b(long long int id,long long int l,long long int r){
tr[id].r=r;tr[id].l=l;
if(r==l){
tr[id].s=nm[l];
return;
}
long long int mid=(r+l)>>1;
b(id*2,l,mid);
b(id*2+1,mid+1,r);
tr[id].s=tr[id*2].s+tr[id*2+1].s;
tr[id].s%=md;
tr[id].c=1;
}
void ac(long long int id,long long int c){
tr[id].s*=c;
tr[id].s%=md;
tr[id].c*=c;
tr[id].c%=md;
tr[id].j*=c;
tr[id].j%=md;
}
void aj(long long int id,long long int j){
tr[id].s+=j*(tr[id].r-tr[id].l+1);
tr[id].s%=md;
tr[id].j+=j;
tr[id].j%=md;
}
void sp(long long int id){
if(tr[id].c!=1){
ac(id*2,tr[id].c);
ac(id*2+1,tr[id].c);
tr[id].c=1;
}
if(tr[id].j){
aj(id*2,tr[id].j);
aj(id*2+1,tr[id].j);
tr[id].j=0;
}
}
long long int dop(long long int id,long long int l,long long int r){ //op=1乘,op=2加,op=3输出,
//cout<<l<<" "<<r<<" "<<id<<endl;
long long int tmp;
if(l==tr[id].l&&r==tr[id].r){
if(op==3)return tr[id].s;
if(op==1){
ac(id,opn);
return 0;
}
if(op==2){
aj(id,opn);
return 0;
}
}
sp(id);
long long int mid=(tr[id].r+tr[id].l)>>1;
if(l<=mid){
if(r<=mid) tmp=dop(id*2,l,r);
else tmp=dop(id*2,l,mid)+dop(id*2+1,mid+1,r);
}
else tmp=dop(id*2+1,l,r);
tr[id].s=tr[id*2].s+tr[id*2+1].s;
tr[id].s%=md;
tmp%=md;
return tmp;
}
int main(){
cin>>n>>q>>tp;
for(int i=1;i<=n;i++)cin>>nm[i];
b(1,1,n);
//for(int i=1;i<=4*n;i++) cout<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].s<<" "<<i<<endl;
while(q--){
cin>>op>>t>>tt;
if(op!=3){
cin>>opn;
dop(1,t,tt);
}
else cout<<dop(1,t,tt)<<endl;
//for(int i=1;i<=4*n;i++) cout<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].s<<" "<<i<<endl;
}
return 0;
}