Getting WA in MAXBTY

#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,(2
tree_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.

Can you please format your code better?

Here is the link to my solution:
https://www.codechef.com/viewsolution/30868199