初始:
#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);
}
}