树状数组 = O(logn) 单点修改 ,O(logn) 区间查询
如果要做到 区间修改 单点查询 我们就要加入差分的思想
用树状数组记录数组的差分 然后对差分进行前缀和就可以得到单点的数据
//ios::sync_with_stdio(false);
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 500010;
int n,m;
ll C[MAXN];
ll lowbit(ll x)
{
return x&-x;
}
void add(ll i,ll val)
{
while(i<=n){
C[i]+=val;
i +=lowbit(i);
}
}
ll sum(ll i)
{
ll s = 0;
while(i>0){
s+=C[i];
i-=lowbit(i);
}
return s;
}
int main(){
cin >> n >> m;
ll l,r,op,k;
ll now = 0;
for(int i=1;i<=n;++i){
cin >> k;
add(i,k-now);
now = k;
}//初始化记录差分数组
for(int i=0;i<m;++i){
cin >> op ;
if(op==1){
cin >> l >> r >> k;
add(l,k);
add(r+1,-k); //区间修改
}
else{
cin >> k;
cout << sum(k) <<endl; //单点查询
}
}
return 0;
}
原文地址:https://www.cnblogs.com/xxrlz/p/10392823.html
时间: 2024-10-14 03:07:33