洛谷 P3368 树状数组【模板2】

这次是区间加值,但是不要慌,可以水过

用了一个差分数组的思想

之后你会发现,某个区间加值

比方说

原数组<0,1,3,6,10>

差分数组中的状态<1,2,3,4>

原数组每个值加二,差分数组中元素除第一位及末位+1位发生了变化,其他没有变化,所以只需要修改差分数组中的修改区间第一位及末位+1位即可

洛谷 P3368 树状数组【模板2】_第1张图片洛谷 P3368 树状数组【模板2】_第2张图片

代码

//By AcerMo
#include
#include
#include
#include
#include
using namespace std;
const int M=1e7+50;
int a[M];//初始的存储数组 
int l_b[M];//树状数组 
int n,m;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch>'9'||ch<'0') {if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f*x;
}
inline int lowbit(int x){return x&-x;} //求x的lowbit值
inline void add(int k,int num)//lowb丢值函数 /构建树形 /后期单点加值 
{
    for (;k<=n;k+=lowbit(k)) l_b[k]+=num;//将lowb数组中所有包含第k位数的位置加上num 
    return ;
}
inline int query(int x)//求第x位数的derta 
{
    int sum=0;
    for (;x;x-=lowbit(x)) sum+=l_b[x];
    return sum;
}
signed  main()
{
    n=read();m=read();
    for (int i=1;i<=n;i++) a[i]=read();
    while (m--)
    {
        int s=read();
        if (s==1)
        {
            int d=read(),b=read(),c=read();
            add(d,c);//区间的始端加c 
            add(b+1,-c);//区间末端的下一位减c 
        }
        else 
        {
            int d=read();cout<

 

你可能感兴趣的:(数据结构-树状数组)