一般的树状数组是单点修改,可以查询前缀和,从而做到查询区间和,两者的时间复杂度都是o(logn)
不过树状数组存储的是原数组的差分数组的话,就可以做到区间修改和查询单点的值
数状数组貌似只能处理一类的问题,同时涉及区间修改和区间查询就不可以了,而且貌似只能做到加(减)的操作,乘,最大公约数,区间最大值,就不可以了,虽然代码少,
不过真正要学习和常用的还是线段树吧,功能更强大,树状数组还是搞一下逆序对就完了
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=5e5+7;
int c[maxn],h[maxn];
int n,m;
inline int lowbit(int x){return x&(-x);}
int add(int x,int d){
while(x<maxn)c[x]+=d,x+=lowbit(x);
}
int get_sum(int x){
int sum=0;
while(x)sum+=c[x],x-=lowbit(x);
return sum;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&h[i]);
for(int i=1;i<=n;i++)add(i,h[i]-h[i-1]);
int op,a,b,k;
while(m--){
scanf("%d",&op);
if(op==1){
scanf("%d%d%d",&a,&b,&k);
add(a,k),add(b+1,-k);
}else{
scanf("%d",&a);
printf("%d\n",get_sum(a));
}
}
return 0;
}