本地运行正常,提交全RE(异常:内存访问非法),请大家帮忙看看
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int *a;
void init()
{
cin>>n>>m;
int *_a=new int[n+1];
a=_a;
for(int i=1;i<=n;i++) cin>>a[i];
}
void deconstruct()
{
delete[] a;
}
class SegtreeNode
{
public:
int lran,rran,tag_add,val;
SegtreeNode *left,*right;
SegtreeNode(int l,int r):lran(l),rran(r)
{
val=0;
for(int i=l;i<=r;i++) val+=a[i];
tag_add=0;
left=nullptr;
right=nullptr;
}
~SegtreeNode()
{
left=nullptr;
right=nullptr;
}
};
class Segtree
{
public:
SegtreeNode *root;
Segtree(int l,int r)
{
root=new SegtreeNode(l,r);
}
~Segtree()
{
delete root;
}
void update(SegtreeNode* &node)
{
if(node->tag_add==0) return;
int mid=(node->lran + node->rran)/2;
if(node->left!=nullptr)
{
node->left->tag_add += node->tag_add;
node->left->val += node->tag_add*(mid - node->lran + 1);
}
if(node->right!=nullptr)
{
node->right->tag_add += node->tag_add;
node->right->val += node->tag_add*(node->rran - mid);
}
node->tag_add=0;
}
void add(SegtreeNode* &node,int x,int y,int k)
{
if(x==node->lran && y==node->rran)
{
node->tag_add += k;
node->val += node->tag_add*(node->rran - node->lran + 1);
return;
}
int mid=(node->lran + node->rran)/2;
if(y<=mid)
{
if(node->left==nullptr) node->left=new SegtreeNode(node->lran,mid);
add(node->left,x,y,k);
}
else if(x>=mid+1)
{
if(node->right==nullptr) node->right=new SegtreeNode(mid+1,node->rran);
add(node->right,x,y,k);
}
else
{
if(node->left==nullptr) node->left=new SegtreeNode(node->lran,mid);
add(node->left,x,mid,k);
if(node->right==nullptr) node->right=new SegtreeNode(mid+1,node->rran);
add(node->right,mid+1,y,k);
}
node->val = node->left->val + node->right->val;
}
int sum(SegtreeNode* &node,int x,int y)
{
update(node);
if(node->lran==x && node->rran==y) return node->val;
int mid=(node->lran + node->rran)/2;
if(node->left==nullptr) node->left=new SegtreeNode(node->lran,mid);
if(node->right==nullptr) node->right=new SegtreeNode(mid+1,node->rran);
if(y<=mid) return sum(node->left,x,y);
if(x>=mid+1) return sum(node->right,x,y);
return sum(node->left,x,mid)+sum(node->right,mid+1,y);
}
};
void _main(Segtree& STree)
{
int op,x,y,k;
for(int i=1;i<=m;i++)
{
cin>>op;
if(op==1)
{
cin>>x>>y>>k;
STree.add(STree.root,x,y,k);
}
else if(op==2)
{
cin>>x>>y;
cout<<STree.sum(STree.root,x,y)<<endl;
}
}
}
int main()
{
init();
Segtree STree(1,n);
_main(STree);
deconstruct();
return 0;
}