区间更新的题 别用 会时间超限
#define lchild left, mid, root<<1 //左区间
#define rchild mid+1, right, root<<1|1 //右区间
#define maxn 1000001
//const int maxn = 100001;
int sum[maxn];
void update(int root) //单节点更新
{
sum[root] = sum[root<<1] + sum[root<<1|1];
}
void build(int left, int right, int root) //建树
{
if (left==right){
cin>>sum[root];
//cout<<sum[root]<<"!!!"<<root<<endl;
return;
}
int mid = (left+right)>>1;
build(lchild); //递归建立左右子树
build(rchild);
update(root); //更新父节点的sum,计算left~right这个区间的士兵数量
}
void operate(int left, int right, int root, int tag, int oper)
{
if (left==right){ //如果找到进行操作
sum[root] += oper;
return;
}
int mid = (left+right)>>1;
if (tag<=mid)
operate(lchild, tag, oper); //如果寻找节点在中点之前,在左区间二分继续找
else
operate(rchild, tag, oper); //否则右区间二分继续找
update(root); //更新节点
}
int inquery(int l, int r, int left, int right, int root)
{
if (l<=left&&r>=right) //当前节点的区间在所查询的区间之内,返回区间和值
return sum[root];
int ans=0;
int mid = (left+right)>>1;
if (l<=mid) //在左区间存在
ans += inquery(l, r, lchild);
if (r>mid) //在右区间存在
ans += inquery(l, r, rchild);
return ans;
}
在update()和 operate()中 对sum[root] 和ans 的操作 需根绝题目要求 去修改