树状数组
单点修改,区间查询
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define ll long long
using namespace std;
const int MAXN = 500005;
ll init() {
ll rv = 0, fh = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') fh = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
rv = (rv<<1) + (rv<<3) + c - '0';
c = getchar();
}
return fh * rv;
}
int n, m, c[MAXN];
ll lowbit(const ll & x){
return x & -x;
}
ll query(ll x) {
ll ans = 0;
for( ; x; x -= lowbit(x)) ans += c[x];
return ans;
}
void add(ll x, ll y) {
for( ; x <= n; x += lowbit(x)) c[x] += y;
}
int main() {
n = init(); m = init();
for(int i = 1; i <= n; i++) {
ll a = init();
add(i, a);
}
for(int i = 1; i <= m; i++) {
ll t = init(), a = init(), b = init();
if(t == 1ll) add(a, b) ;
else {
printf("%lld\n", query(b) - query(a -1));
}
}
return 0;
}
区间修改,单点查询(差分)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define ll long long
using namespace std;
const int MAXN = 500005;
ll init() {
ll rv = 0, fh = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') fh = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
rv = (rv<<1) + (rv<<3) + c - '0';
c = getchar();
}
return fh * rv;
}
ll n, m, c[MAXN];
ll lowbit(const ll &x) {
return x & -x;
}
ll query(ll x) {
ll ans = 0;
for( ; x; x -= lowbit(x)) ans += c[x];
return ans;
}
void add(ll x, ll y) {
for( ; x <= n; x += lowbit(x)) c[x] += y;
}
int main() {
n = init(); m = init();
for(int i = 1; i <= n; i++) {
ll t = init();
add(i, t); add(i + 1, -t);
}
for(int i = 1; i <= m; i++) {
ll t = init();
if(t == 1){
ll a = init(), b = init(), k = init();
add(a, k); add(b + 1, -k);
}else {
ll x = init();
printf("%lld\n", query(x));
}
}
return 0;
}