1 / 1
Mar 2022

This is my code. I’m sure it can pass the problem, but spoj always prompts Runtime Error (SIGSEGV), How can I solve it?

#include<cstdio>
#include<cmath>
long long n,m;
long long op,x,y;
long long a[4000000];
long long Max(long long a,long long b)
{
	return a>b?a:b;
}
long long Swap(long long &a,long long &b)
{
	long long tmp=a;
	a=b;
	b=tmp;
}
struct node
{
	long long l,r;
	long long val;
	long long maxn;
};
struct seg
{
	node t[10000000];
	void pushup(long long k)
	{
		t[k].val=t[2*k].val+t[2*k+1].val;
		t[k].maxn=Max(t[2*k].maxn,t[2*k+1].maxn);
	}
	void build(long long k,long long l,long long r)
	{
		t[k].l=l;
		t[k].r=r;
		if(t[k].l==t[k].r)
		{
			t[k].val=t[k].maxn=a[l];
			return ;
		}
		long long mid=(l+r)>>1;
		build(2*k,l,mid);
		build(2*k+1,mid+1,r);
		pushup(k);
	}
	void update(long long k,long long l,long long r)
	{
		if(t[k].maxn==1) return ;
		if(t[k].l==t[k].r)
		{
			t[k].val=t[k].maxn=sqrt(t[k].val);
			return ;
		}
		long long mid=(t[k].l+t[k].r)>>1;
		if(l<=mid) update(2*k,l,r);
		if(r>mid) update(2*k+1,l,r);
		pushup(k);
	}
	long long query(long long k,long long l,long long r)
	{
		if(t[k].l>=l&&t[k].r<=r) return t[k].val;
		long long mid=(t[k].l+t[k].r)>>1;
		long long ans=0;
		if(l<=mid) ans+=query(2*k,l,r);
		if(r>mid) ans+=query(2*k+1,l,r);
		return ans;
	}
}tree;
long long t;
int main()
{
	while(~scanf("%lld",&n))
	{
		printf("Case #%d:\n",++t);
		for(long long i=1;i<=n;i++) scanf("%lld",&a[i]);
		scanf("%lld",&m);
		tree.build(1,1,n);
		while(m--)
		{
			scanf("%lld%lld%lld",&op,&x,&y);
			if(x>y) Swap(x,y);
			if(op==0) tree.update(1,x,y);
			if(op==1) printf("%lld\n",tree.query(1,x,y));
		}
		printf("\n");
	}
	return 0;
}