【树状数组模版】
注意:树状数组x必须>0,因为lowbit(0) = 0,会死循环;
【单点更新区间查询】在log(n)内修改单点,求出cnt[x] = a[1]~a[x]之和
求区间[a,b]之和只要求出 sum(b)-sum(a-1)即可
#define rep(i,a,n) for(int i = a; i < n; i++)
#define repe(i,a,n) for(int i = a; i <= n; i++)
#define per(i,n,a) for(int i = n; i >= a; i--)
#define clc(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long LL;
#define MAXN 100010
int cnt[MAXN],mx, a[MAXN];
inline int lowbit(int x){return x&-x;}
int sum(int x)
{
int ans = 0;
while(x > 0)
{
ans += cnt[x];
x -= lowbit(x);
}
return ans;
}
void update(int x, int num)
{
while(x <= mx)
{
cnt[x] += num;
x += lowbit(x);
}
}
【区间更新单点查询】在log(n)内修改区间a[1]~a[x]覆盖次数,求出单点被覆盖的次数
要修改区间[a,b]的覆盖次数+1,可以 update(b,1), update(a-1,-1);
#define rep(i,a,n) for(int i = a; i < n; i++)
#define repe(i,a,n) for(int i = a; i <= n; i++)
#define per(i,n,a) for(int i = n; i >= a; i--)
#define clc(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long LL;
#define MAXN 100010
int cnt[MAXN],mx, a[MAXN];
inline int lowbit(int x){return x&-x;}
int sum(int x)
{
int ans = 0;
while(x <= mx)
{
ans += cnt[x];
x += lowbit(x);// += 是点 -=是区间,所用到的点独立,区间不相交
}
return ans;
}
void update(int x, int num)
{
while(x > 0)
{
cnt[x] += num;
x -= lowbit(x);
}
}