锰锌釚铸铣锻鉥
查看原帖
锰锌釚铸铣锻鉥
335094
Lucifero楼主2021/6/27 15:32

初始:

#include <bits/stdc++.h>
#define ls ((u)<<1)
#define rs ((u)<<1|1)
using namespace std;
class SegmentTree
{
public:
	int l,r,w;
}tree[400001];
int a[100001],n;

建树:

void tbuild(int u,int l,int r)
{
	tree[u].l=l,tree[u].r=r;
	if (l==r)
	{
		tree[u].w=a[l];
		return;
	}
	int mid=(l+r)>>1;
	tbuild(ls,l,mid);
	tbuild(rs,mid+1,r);
	tree[u].w=tree[ls].w+tree[rs].w;
}

区间求和:

int tsum(int u,int x,int y)
{
	if (tree[u].l>=x && tree[u].r<=y)
		return tree[u].w;
	int mid=(tree[u].l+tree[u].r)>>1,tot=0;
	if (x<=mid) tot+=tsum(ls,x,y);
	if (y>mid) tot+=tsum(rs,x,y);
	return tot;
}

区间取模:

void tmod(int u,int x,int y,int p)
{
	if (tree[u].l>=x && tree[u].r<=y)
	{
		tree[u].w%=p;
		return;
	}
	int mid=(tree[u].l+tree[u].r)>>1;
	if (x<=mid) tmod(ls,x,y,p);
	if (y>mid) tmod(rs,x,y,p);
	tree[u].w=tree[ls].w+tree[rs].w;
}

单点赋值:

void tset(int u,int x,int y)
{
	if (tree[u].l==tree[u].r)
	{
		tree[u].w=y;
		return;
	}
	int mid=(tree[u].l+tree[u].r)>>1;
	if (x<=mid) tset(ls,x,y);
	else tset(rs,x,y);
	tree[u].w=tree[ls].w+tree[rs].w;
}

主函数:

int main()
{
	//[CF438D]The Child and Sequence
	int m,opt,x,y,p,i;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++) scanf("%d",&a[i]);
	tbuild(1,1,n);
	while(m--)
	{
		scanf("%d%d%d",&opt,&x,&y);
		if (opt==1)
			printf("%d\n",tsum(1,x,y));
		else if (opt==2)
		{
			scanf("%d",&p);
			tmod(1,x,y,p);
		}
		else if (opt==3)
			tset(1,x,y);
	}
}
2021/6/27 15:32
加载中...