TLE 球条
查看原帖
TLE 球条
639198
Steve_xh楼主2023/11/28 12:41

TLE on #2 #9 and #10

Code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[100005],mod;
struct Tree{
	int l,r,v;
}t[100005<<2];
void pushup(int x){
	t[x].v=(t[x<<1].v+t[x<<1|1].v)%mod;
}
void bt(int x,int l,int r){
	t[x].l=l,t[x].r=r;
	if(l==r){
		t[x].v=a[l];
		return;
	}
	int mid=(l+r)>>1;
	bt(x<<1,l,mid);
	bt(x<<1|1,mid+1,r);
	pushup(x);
}
void upd(bool op,int x,int k,int l,int r){//更新=(op?乘法:加法); 
	if(t[x].l==t[x].r){
		t[x].v=(op?t[x].v*k:t[x].v+k)%mod;
		return;
	}
	int mid=(t[x].l+t[x].r)>>1;
	if(l<=mid)
		upd(op,x<<1,k,l,r);
	if(mid<r)
		upd(op,x<<1|1,k,l,r);
	pushup(x);
}
int query(int x,int l,int r){
	if(l<=t[x].l&&t[x].r<=r)
		return t[x].v;
	int mid=(t[x].l+t[x].r)>>1,reans=0;
	if(l<=mid)
		reans+=query(x<<1,l,r);
	if(mid<r)
		reans+=query(x<<1|1,l,r);
	return reans;
}
signed main(){
	scanf("%lld%lld%lld",&n,&m,&mod);
	for(int i=1;i<=n;i++)
		scanf("%lld",a+i);
	bt(1,1,n);
	for(int i=1,op,x,y,k;i<=m;i++){
		scanf("%lld%lld%lld",&op,&x,&y);
		if(op<3)
			scanf("%lld",&k);
		else
			printf("%lld\n",query(1,x,y)%mod);
		if(op==1)
			upd(1,1,k,x,y);
		else if(op==2)
			upd(0,1,k,x,y);
	}
	return 0;
}
2023/11/28 12:41
加载中...