///树状数组
#include <iostream>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <bitset>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <algorithm>
#include <functional>
#define PI acos(-1)
#define eps 1e-8
#define inf 0x3f3f3f3f
#define debug(x) cout<<"---"<<x<<"---"<<endl
typedef long long ll;
using namespace std;
///单点修改+区间求和
int arr[MAXN];
inline int sum(int x)
{
int res = 0;
while (x)
{
res += arr[x], x -= lowbit(x);
}
return res;
}
inline void add(int x, int n) ///单点修改
{
while (x < MAXN)
{
arr[x] += n, x += lowbit(x);
}
}
inline int query(int x, int y)///区间求和
{
return sum(y) - sum(x - 1);
}
///区间修改+单点查询
int arr[MAXN]
inline int sum(int x)
{
int res = 0;
while (x)
{
res += arr[x], x -= lowbit(x);
}
return res;
}
inline void add(int x, int n)
{
while (x < MAXN)
{
arr[x] += n, x += lowbit(x);
}
}
inline int update(int x, int y, int n)///区间修改
{
add(x, n);
add(y + 1, -n);
}
///二维树状数组
int arr[MAXN][MAXN]
inline void add(int x, int y, int n) ///单点修改
{
for (int i = x; i < MAXN; i += lowbit(i))
for (int j = y; j < MAXN; j += lowbit(j))
{
arr[i][j] += n;
}
}
inline int sum(int x, int y)
{
int res = 0;
for (int i = x; i; i -= lowbit(i))
for (int j = y; j; j -= lowbit(j))
{
res += arr[i][j];
}
return res;
}
inline int query(int L, int B, int R, int T) ///矩阵求和
{
return sum(R, T) + sum(L - 1, B - 1) - sum(R, B - 1) - sum(L - 1, T);
}
inline void update(int L, int B, int R, int T, int n) ///矩阵修改
{
update(L, B, n);
update(L, T + 1, n);
update(R + 1, B, n);
update(R + 1, T + 1, n);
}