萌新求助,[模板]线段树2
  • 板块学术版
  • 楼主Nekobread
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/10/21 20:31
  • 上次更新2023/11/4 03:00:55
查看原帖
萌新求助,[模板]线段树2
180755
Nekobread楼主2021/10/21 20:31

这个线段树2的代码一直不对,我也不知道错在哪里了,都改了好些天了,求大佬指正

#include<bits/stdc++.h>
#define LCHILD(x) (x << 1)
#define RCHILD(x) (x << 1 | 1)

using namespace std;

const int MAXN = 1e5 + 1;

int op,x,y,k;

int n,m,Mod;
int a[MAXN];

struct Node
{
	long long l,r;
	long long multag;
	long long addtag;
	long long data;
}st[MAXN * 4];

void pushup(int p)
{
	st[p].data = (st[LCHILD(p)].data + st[RCHILD(p)].data) % Mod;
}

void build(int p, int left, int right)
{
	st[p].l = left;
	st[p].r = right;
	st[p].multag = 1;
	st[p].addtag = 0;
	if(left == right)
	{
		st[p].data = a[left] % Mod;
		return;
	}
	
	int middle = (left + right) >> 1;
	build(LCHILD(p), left, middle);
	build(RCHILD(p), middle + 1, right);
	pushup(p);
}

void pushdown(int p)
{
	st[LCHILD(p)].data = (st[LCHILD(p)].data * st[p].multag % Mod + (st[LCHILD(p)].r - st[LCHILD(p)].l + 1) * st[p].addtag % Mod) % Mod;
	st[RCHILD(p)].data = (st[RCHILD(p)].data * st[p].multag % Mod + (st[RCHILD(p)].r - st[RCHILD(p)].r + 1) * st[p].addtag % Mod) % Mod;
	st[LCHILD(p)].multag = (st[p].multag * st[LCHILD(p)].multag) % Mod;
	st[RCHILD(p)].multag = (st[p].multag * st[RCHILD(p)].multag) % Mod;
	st[LCHILD(p)].addtag = (st[LCHILD(p)].addtag * st[p].multag % Mod + st[p].addtag) % Mod;
	st[RCHILD(p)].addtag = (st[RCHILD(p)].addtag * st[p].multag % Mod + st[p].addtag) % Mod;
	st[p].multag = 1;
	st[p].addtag = 0;
}

void updata_mul(int p,int l,int r,long long k)
{
	if(st[p].l > r || st[p].r < l) return;
	if(l <= st[p].l && st[p].r <= r)
	{
		st[p].data = (st[p].data * k) % Mod;
		st[p].addtag = (st[p].addtag * k) % Mod;
		st[p].multag = (st[p].multag * k) % Mod;
		return;
	}
	
	pushdown(p);
	pushup(p);
	updata_mul(LCHILD(p), l, r, k);
	updata_mul(RCHILD(p), l, r, k);
	pushup(p);
}

void updata_add(int p,int l,int r,long long k)
{
	if(st[p].l > r || st[p].r < l) return;
	if(l <= st[p].l && st[p].r <= r)
	{
		st[p].data = (st[p].data + (st[p].r - st[p].l + 1) * k) % Mod;
		st[p].addtag = (st[p].addtag + k) % Mod;
		return;
	}
	
	pushdown(p);
	pushup(p);
	updata_add(LCHILD(p), l, r, k);
	updata_add(RCHILD(p), l, r, k);
	pushup(p);
}

long long query(int p,int l,int r)
{
	if(r < st[p].l || st[p].r < l) return 0;
	if(l <= st[p].l && st[p].r <= r) return st[p].data;
	pushdown(p);
	return (query(LCHILD(p), l, r) + query(RCHILD(p), l, r)) % Mod;
}

int main()
{
	cin >> n >> m >> Mod;
	for(int i = 1;i <= n;i ++ )
	{
		cin >> a[i];
	}
	
	build(1,1,n);
	
	for(int i = 1;i <= m;i ++ )
	{
		cin >> op;
		if(op == 1)
		{
			cin >> x >> y >> k;
			updata_mul(1,x,y,k);
		}
		else if(op == 2)
		{
			cin >> x >> y >> k;
			updata_add(1,x,y,k);
		}
		else if(op == 3)
		{
			cin >> x >> y;
			cout << query(1,x,y) << endl;
		}
	}
	return 0;
}
2021/10/21 20:31
加载中...