单点链接
#include <iostream>
#define endl "\n"
const int N = 500010;
using namespace std;
int n, m;
int a[N], c[N];
int lowbit (int x)
{
return (-x) & x;
}
void add (int k, int v)
{
while (k <= n)
{
c[k] += v;
k += lowbit (k);
}
}
int query (int k)
{
int s = 0;
for (int i = k; i > 0; i -= lowbit (i))
{
s += c[i];
}
return s;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i ++) cin >> a[i] , add (i, a[i]);
while (m --)
{
int opt;
cin >> opt;
if (opt == 1)
{
int k, v;
cin >> k >> v;
add (k, v);
}
else
{
int l, r;
cin >> l >> r;
cout << query (r) - query (l - 1) << endl;
}
}
}
区间链接
#include <iostream>
#include <cstring>
#include <algorithm>
#define endl "\n"
#define int long long
const int N = 500010;
using namespace std;//BIT
int n, m;
int a[N], tree[N];//原数组 差分数组
int lowbit(int x)
{
return x & -x;
}
void add (int k, int v)
{
for (int i = k; i <= n; i += lowbit (i)) tree[i] += v;
}
int query (int k)
{
int s = 0;
for (int i = k; i; i -= lowbit (i)) s += tree[i];
return s;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
for (int i = 1; i <= n; i ++ ) add (i, a[i] - a[i - 1]);//存差分数组
while (m -- )
{
char op;
cin >> op;
if (op == '1')
{
int l, r, x;
cin >> l >> r >> x;//构建差分数组 在 a[l] + x , 在a[r + 1] - x;
add (l, x);
add (r + 1, -x);
}
else
{
int x;
cin >> x;
cout << query (x) << endl;//发现求 x 处的值其实就是将差分数组从 tree[1] + tree[2] + ... + tree[k]
}
}
}