0pts求助(玄关)
查看原帖
0pts求助(玄关)
1208635
caochenkai楼主2024/8/2 13:02
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define endl '\n'
using namespace std;
const int INF = 0x3fffffff, MAXN = 1e4+10;
const int N = 1e6+10;
int n, m,a[N], k,tag[4*N+10],tree[N * 4+10],tag1[4*N+10],mod;
int ls(int x)
{
	return x << 1;
}
int rs(int x)
{
	return x << 1 | 1;
}
void push_up(int x)
{
	tree[x] = tree[ls(x)]+tree[rs(x)]%mod;
}
void build(int l, int r, int x)
{
	if (l == r)
	{
		tree[x] = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(l, mid, ls(x));
	build(mid + 1, r, rs(x));
	push_up(x);
}
int ans(int L, int R, int l, int r, int x)
{
	if(l>r)return 0;
	if (L <= l && R >= r)return tree[x];
	int mid = (l + r) >> 1, sum = 0;
	if(tag1[x])
	{
		tree[ls(x)]+=tag[x]*(mid-l+1),tree[rs(x)]+=tag[x]*(r-mid);
		tree[ls(x)]*=tag1[x],tree[rs(x)]*=tag1[x];
		tag1[ls(x)]*=tag1[x],tag1[rs(x)]*=tag1[x];
		tag1[x]=0,tag[x]=0;
	}
	if(tag[x])
	{
		tree[ls(x)]+=tag[x]*(mid-l+1),tree[rs(x)]+=tag[x]*(r-mid);
		tag[ls(x)]+=tag[x],tag[rs(x)]+=tag[x];
		tag[x]=0;
	}
	if (L <= mid)sum+=ans(L, R, l, mid, ls(x));
	if (R > mid)sum+=ans(L, R, mid+1, r, rs(x));
	return sum%mod;
}
void change(int L, int R, int l, int r, int x,int k)
{
	if(l>r)return;
	if (L <= l && R >= r)
	{
		tree[x]+=(r-l+1)*k;
        tree[x]%=mod;
		tag[x]+=k;
		return ;
	}
	int mid = (l + r) >> 1;
	if(tag[x])
	{
		tree[ls(x)]+=tag[x]*(mid-l+1),tree[rs(x)]+=tag[x]*(r-mid);
        tree[ls(x)]%=mod,tree[rs(x)]%=mod;
		tag[ls(x)]+=tag[x],tag[rs(x)]+=tag[x];
		tag[x]=0;
	}
	if (L <= mid)change(L, R, l, mid, ls(x),k);
	if (R > mid)change(L, R, mid+1, r, rs(x),k);
	push_up(x);
}
void change1(int L, int R, int l, int r, int x,int k)
{
	if(l>r)return;
	if (L <= l && R >= r)
	{
		tree[x]*=k;
        tree[x]%=mod;
		tag1[x]*=k;
		return ;
	}
	int mid = (l + r) >> 1;
	if(tag1[x])
	{
		tree[ls(x)]+=tag[x]*(mid-l+1),tree[rs(x)]+=tag[x]*(r-mid);
		tree[ls(x)]*=tag1[x],tree[rs(x)]*=tag1[x];
        tree[ls(x)]%=mod,tree[rs(x)]%=mod;
		tag1[ls(x)]*=tag1[x],tag1[rs(x)]*=tag1[x];
		tag1[x]=0,tag[x]=0;
	}
	if (L <= mid)change1(L, R, l, mid, ls(x),k);
	if (R > mid)change1(L, R, mid+1, r, rs(x),k);
	push_up(x);
}
signed main()
{
	cin >> n>>m>>mod;
	for (int i = 1; i <= n; i++)cin >> a[i];
//	memset(tag1,1,sizeof(tag1));
	build(1, n, 1);
	for(int i=1; i<=m; i++)
	{
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1)
		{
			int k;
			cin>>k;
			change1(x,y,1,n,1,k);
		}
		if(op==2)
		{
			int k;
			cin>>k;
			change(x,y,1,n,1,k);
		}
		if(op==3)cout<<ans(x,y,1,n,1)%mod<<'\n';
//        if(op!=3)
//        {
//            for(int i=1;i<=n;i++)cout<<ans(i,i,1,n,1)<<' ';
//            cout<<'\n';
//        }
	}
	return 0;
}

样例过了

2024/8/2 13:02
加载中...