【树状数组】Range Update Queries
题目描述:
给定一个包含 n 个整数的数组,你的任务是处理 q 个以下类型的查询:
- 将区间 [a,b] 中的每个个值都增加 u
- 查询位置 k 处的值是多少?
输入:
第一行输入两个整数 n 和 q:分别表示数组元素的数量和查询的数量。
第二行有 n 个整数 x1,x2,...,xn:表示数组的元素。
接下来有 q 行,每行描述一个查询,包含三个或四个整数:
- 若为 "1 a b u",表示将区间 [a,b] 中的每个元素增加 u
- 若为 "2 k",表示查询位置 k 处的元素值
约束条件:
1 ≤ n,q ≤ 2*105
1 ≤ xi, u ≤ 109
1 ≤ k ≤ n
1 ≤ a ≤ b ≤ n输出:
对于每个类型 2 的查询,输出对应的结果。样例输入
复制
8 3 3 2 4 5 1 1 5 3 2 4 1 2 5 1 2 4
样例输出
复制
5 6
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;int n,q;
ll x[N]{0},p[N];void update(int idx,ll val)
{for(;idx<=n;idx+=(idx&-idx))p[idx]+=val;
}ll sol(int idx)
{ll sum=0;for(;idx>0;idx-=(idx&-idx))sum+=p[idx];return sum;
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n>>q;for(int i=1;i<=n;++i){cin>>x[i];update(i,x[i]-x[i-1]);}while(q--){int c;cin>>c;if(c==1){ll a,b,u;cin>>a>>b>>u;update(a,u);update(b+1,-u);}else {int k;cin>>k;cout<<sol(k)<<'\n';}} return 0;
}