感谢博主:https://www.cnblogs.com/jason2003/p/9676729.html
值得一提的是,计算2时一定要改成i<<1这样能解决很多时间,还有要开long long,还有,函数前面要加inline 我在其他OJ交这道题时,就因为没加inline 就被卡了,交了就过了。*
板块一:区间查询+单点修改
洛谷P3374
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define endl '\n'
#define mem(a) memset(a,0,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
int n,m;
int ans;
int input[500010];
struct node{
int l,r;
int sum;
}tree[2000010];
inline void build(int i,int l,int r){
//递归建树
tree[i].l=l;tree[i].r=r;
if(l==r){
tree[i].sum=input[l];
return ;
}
int mid=(l+r)>>1;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
inline int search(int i,int l,int r){
if(tree[i].l>=l && tree[i].r<=r)//区间查询
return tree[i].sum;
if(tree[i].r<l || tree[i].l>r) return 0;
int s=0;
if(tree[i*2].r>=l) s+=search(i*2,l,r);
if(tree[i*2+1].l<=r) s+=search(i*2+1,l,r);
return s;
}
inline void add(int i,int dis,int k){
if(tree[i].l==tree[i].r){
//修改单点
tree[i].sum+=k;