推导见pecco树状数组
板子
int n;
const int M = 2e5 + 9;
int tree[M];
int lowbit(int x) {
return x & (-x);
}
void update(int x, int y) {//建树
for (int pos = x;pos <= n;pos += lowbit(pos))
tree[pos] += y;
}
int ask(int x) {//查询单点值
int ans = 0;
for (int pos = x;pos;pos -= lowbit(pos))
ans += tree[pos];
return ans;
}
int query(int x,int y) {//查询区间和
return ask(y) - ask(x - 1);
}
板子题1
洛谷树状数组板子1
/*
//单点修改
void change(int i, int x) {
for (int pos = i;pos <= M;pos += lowbit(pos))
tree[pos] += x;
}
//区间查询
void query(int x, int y) {
return ask(y) - ask(x - 1);
}
void ask(int x) {
int ans = 0;
for (int pos = x;po;pos -= lowbit(pos))
ans += tree(pos);
return ans;
}
*/
#include<bits/stdc++.h>
using namespace std;
const int M = 5e5 + 9;
int tree[M];
#define int long long
int lowbit(int x) {
return x & (-x);
}
void add(int x, int y) {
for (int pos = x;pos < M;pos += lowbit(pos))
tree[pos] += y;
}
int ask(int x) {
int ans = 0;
for (int pos = x;pos;pos -= lowbit(pos))
ans += tree[pos];
return ans;
}
int query(int x, int y) {
return ask(y) - ask(x - 1);
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;cin >> n >> m;
for (int i = 1;i <= n;i++) {
int p;cin >> p;
add(i, p);
}
while (m--) {
int a;cin >> a;
int b, c;cin >> b >> c;
if (a == 1)add(b, c);
if (a == 2)cout << query(b, c) << '\n';
}
return 0;
}