不知道为什么,数据前几个都能过,都是后面的报错。调试无果,特来求助.
#include<iostream>
using namespace std;
const int maxn = 1e5+10;
int n, m, q, input[maxn];
struct Node{
int l, r, sum, lazy;
Node *lson, *rson;
Node(){
l=r=sum=0;
lson=rson=NULL;
}
};
Node * root = new Node;
void update(Node *node){
node->sum=0; //非常重要
if (node->lson) node->sum+=node->lson->sum;
if (node->rson) node->sum+=node->rson->sum;
}
//建树
void build(Node *node, int l, int r){
node->l=l,node->r=r;
if (l==r){
node->sum=input[l];
return;
}
else {
int mid=l+(r-l)/2;
node->lson=new Node;
node->rson=new Node;
build(node->lson, l, mid);
build(node->rson, mid+1, r);
update(node);
}
}
// 向下传参
void setDown(Node *node){
int l=node->l,r=node->r, lazy=node->lazy;
if (l==r){
node->sum+=lazy;
}else{
Node *l_nd=node->lson, *r_nd=node->rson;
//左
if (l_nd){
setDown(l_nd);
node->sum+=lazy;
}
//右
if (r_nd){
setDown(r_nd);
node->sum+=lazy;
r_nd->lazy=0;
}
update(node);
}
}
//区间修改
void changeSegment(Node *node, int l, int r, int k){
int l_=node->l, r_=node->r;
//修改
if (l_==l&&r_==r){
node->lazy+=k;
setDown(node);
}else {
Node *l_nd=node->lson, *r_nd=node->rson;
int mid = l_+(r_-l_)/2;
if (r<=mid){
changeSegment(l_nd, l, r, k);
}else if (mid<l){
changeSegment(r_nd, l, r, k);
}else {
changeSegment(l_nd, l, mid, k);
changeSegment(r_nd, mid+1, r, k);
}
update(node);
}
}
//区间 ?和:
int find_segment(int l, int r, Node *node){
int l_=node->l, r_=node->r;
if (l_==l&&r_==r) return node->sum;
else {
int mid=l_+(r_-l_)/2;
if(r<=mid){
return find_segment(l, r, node->lson);
}else if(mid<l){
return find_segment(l, r, node->rson);
}else {
return find_segment(l,mid, node->lson)+find_segment(mid+1, r, node->rson);
}
}
}
int main(){
cin >> n >> q;
for (int i=0; i<n; i++){
cin >> input[i];
}
//建树
build(root, 0, n-1);
//Conqulate:
int in, l, r, k;
for (int i=0; i<q; i++){
cin>>in >> l >> r;
l--, r--;
if (in==1){
cin >> k;
changeSegment(root, l, r, k);
}else {
int num = find_segment(l, r, root);
cout << num << endl;
}
}
return 0;
}