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;
}