所有点都RE了,但本地运行正常,求调
Runtime Error.
Received signal 11: Segmentation fault with invalid memory reference.
#include<iostream>
#include<cstdio>
using namespace std;
int n,q,m,a[100004];
int ncnt=1;
struct Segnode
{
int lran,rran,val,tag_add;
Segnode *left,*right;
void init(int lr,int rr)
{
lran=lr;rran=rr;val=0;tag_add=0;
for(int i=lran;i<=rran;i++) val+=a[i];
left=nullptr; right=nullptr;
}
void pushdown();
void add(int x,int y,int k);
//void mult(int x,int y,int k);
int sum(int x,int y);
}nodes[200008];
void checkleft(Segnode& node)
{
if(node.left==nullptr && node.lran!=node.rran)
{
nodes[++ncnt].init(node.lran,(node.lran+node.rran)/2);
node.left=&nodes[ncnt];
}
}
void checkright(Segnode& node)
{
if(node.right==nullptr && node.lran!=node.rran)
{
nodes[++ncnt].init((node.lran+node.rran)/2+1,node.rran);
node.right=&nodes[ncnt];
}
}
void Segnode::pushdown()
{
left->tag_add += tag_add; left->val += tag_add*(left->rran - left->lran + 1);
right->tag_add += tag_add; right->val += tag_add*(right->rran - right->lran + 1);
tag_add=0;
}
void Segnode::add(int x,int y,int k)
{
if(lran==x && rran==y)
{
tag_add+=k;
val+=k*(rran-lran+1);
return;
}
int mid=(lran+rran)/2;
if(y<=mid)
{
checkleft(*this);
left->add(x,y,k);
}
else if(x>=mid+1)
{
checkright(*this);
right->add(x,y,k);
}
else
{
checkleft(*this);
checkright(*this);
left->add(x,mid,k);
right->add(mid+1,y,k);
}
val= left->val + right->val;
}
int Segnode::sum(int x,int y)
{
if(lran==x && rran==y) return val;
checkleft(*this);checkright(*this);pushdown();
int mid=(lran+rran)/2;
if(y<=mid)
{
checkleft(*this);
return left->sum(x,y);
}
if(x>=mid+1)
{
checkright(*this);
return right->sum(x,y);
}
checkleft(*this);checkright(*this);
return left->sum(x,mid) + right->sum(mid+1,y);
}
int main()
{
cin>>n>>q;//>>m;
for(int i=1;i<=n;i++) cin>>a[i];
Segnode& root=nodes[1];
root.init(1,n);
for(int i=1;i<=q;i++)
{
int op,x,y,k;
cin>>op;
if(op==1)
{
cin>>x>>y>>k;
root.add(x,y,k);
}
if(op==2)
{
cin>>x>>y;
cout<<root.sum(x,y)<<endl;
}
}
return 0;
}