#include <stdio.h>
long int max(long int x,long int y)
{
if(x>=y)
{
return x;
}
else
return y;
}
long int *makeTree(long int a[],long int tree[][3],int start,int end,int tree_node)
{
int mid=(start+end)/2;
long int *l,*r;
if(start==end)
{
tree[tree_node][0]=a[start-1];
tree[tree_node][1]=a[start-1];
tree[tree_node][2]=a[start-1];
return tree[tree_node];
}
l=makeTree(a,tree,start,mid,2*tree_node);
r=makeTree(a,tree,mid+1,end,(2*tree_node)+1);
tree[tree_node][1]=l[1]+r[1];
tree[tree_node][2]=max(l[2],l[1]+r[2]);
tree[tree_node][0]=max(r[0],r[1]+l[0]);
return tree[tree_node];
}
int update(long int tree[][3],long int update_val,int index,int start,int end,int tree_node)
{
int mid=(start+end)/2;
if(start==end)
{
tree[tree_node][0]=update_val;
tree[tree_node][1]=update_val;
tree[tree_node][2]=update_val;
return 0;
}
if(index<=mid)
{
update(tree,update_val,index,start,mid,2tree_node);
}
else
{
update(tree,update_val,index,mid+1,end,(2tree_node)+1);
}
tree[tree_node][1]=tree[2*tree_node][1]+tree[(2*tree_node)+1][1];
tree[tree_node][2]=max(tree[2*tree_node][2],tree[(2*tree_node)][1]+tree[(2*tree_node)+1][2]);
tree[tree_node][0]=max(tree[(2*tree_node)+1][0],tree[(2*tree_node)+1][1]+tree[2*tree_node][0]);
}
long int sum_query(long int tree[][3],int tree_node,int l,int r,int start,int end)
{
int mid=(start+end)/2;
if((l<start && r<start)||(l>end && r>end))
{
return 0;
}
else
if(start>=l && end<=r)
{
return tree[tree_node][1];
}
else
return sum_query(tree,2*tree_node,l,r,start,mid)+sum_query(tree,(2*tree_node)+1,l,r,mid+1,end);
}
long int prefix(long int tree[][3],int tree_node,int l,int r,int start,int end)
{
int mid=(start+end)/2;
long int p1,p2,sum;
if((l<start && r<start)||(l>end&&r>end))
{
return 0;
}
else
if(start>=l && end<=r)
{
return tree[tree_node][2];
}
else
{
p1=prefix(tree,tree_node*2,l,r,start,mid);
p2=prefix(tree,(2*tree_node)+1,l,r,mid+1,end);
sum=sum_query(tree,(2*tree_node)+1,l,r,mid+1,end);
return max(p2,p1+sum);
}
}
long int suffix(long int tree[][3],int tree_node,int l,int r,int start,int end)
{
int mid=(start+end)/2;
long int p1,p2,sum;
if((l<start && r<start)||(l>end&&r>end))
{
return 0;
}
else
if(start>=l && end<=r)
{
return tree[tree_node][0];
}
else
{
p1=suffix(tree,tree_node*2,l,r,start,mid);
p2=suffix(tree,(2*tree_node)+1,l,r,mid+1,end);
sum=sum_query(tree,2*tree_node,l,r,start,mid);
return max(sum+p2,p1);
}
}
int main(void) {
// your code goes here
int t,n,q,i;
long int x,y;
long int sum,pre,suf;
char s[3];
// long int a[100000];
// long int tree[400000][3];
scanf("%d",&t);
char c;
while(t–)
{
scanf("%d %d",&n,&q);
long int a[n];
long int tree[4*n][3];
for(i=0;i<n;i++)
{
scanf("%ld",&a[i]);
}
makeTree(a,tree,1,n,1);
while(q)
{
fflush(stdin);
scanf("%s",s);
c=s[0];
scanf("%ld %ld",&x,&y);
if(c=='Q')
{
sum=sum_query(tree,1,x,y,1,n);
if(x!=1)
{
suf=suffix(tree,1,1,x-1,1,n);
}
else
{
suf=0;
}
if(suf<0)
{
suf=0;
}
if(y!=n)
{
pre=prefix(tree,1,y+1,n,1,n);
}
else
{
pre=0;
}
if(pre<0)
pre=0;
printf("%ld\n",suf+pre+sum);
}
else
if(c=='U')
{
update(tree,y,x,1,n,1);
}
q-=1;
}
}
return 0;
}
Couldn’t Understand what is wrong with the code. I am a begginner so please help me out.