I am getting TLE for SPOJ - GSS1 while using Segment Trees , Can anyone show me what's wrong in my code?

Here is my code:

      /**

#include
#include

#include
#include<stdio.h>
#include<bits/stdc++.h>

using namespace std;
#define MAXN1 (1<<16)
#define MAXN2 (MAXN1 << 2)

struct data{
long long sum,pref,suff,ans;
};

data t[MAXN2];
int a[MAXN1];

class CanYouAnswerTheseQueriesI {
public:

data combine(data l, data r){
	data res;
	res.sum = l.sum + r.sum;
	res.pref = max(l.pref, l.sum+r.pref);
	res.suff = max(r.suff, r.sum+l.suff);
	res.ans = max(max(l.ans,r.ans),l.suff+r.pref);
	return res;
}


data make_data(int val){
	data res;
	res.sum = val;
	res.pref = res.suff = res.ans = max(0,val);
	return res;
}


void build(int v, int tl, int tr){
	if(tl == tr){
		t[v] = make_data(a[tl]);
	}
	else{
		int tm = (tl+(tr-tl))/2;
		build(v*2,tl,tm);
		build(v*2+1,tm+1,tr);
		t[v] = combine(t[v*2],t[v*2+1]);
	}
}


data query(int v, int tl,int tr, int l, int r){
	if(l > r)return make_data(0);
	if(l == tl && r == tr)return t[v];
	int tm = (tl + tr)/2;
	return combine(query(v*2,tl,tm,l,min(r,tm)), query(v*2+1, tm+1, tr, max(l,tm+1),r));
}



void solve(std::istream& in, std::ostream& out) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

	int n;
	in >> n;

	for(int i=0;i<n;i++)in >> a[i];
	build(1,0,n-1);
	int m;
	in >> m;
	while(m--){
		int l,r;
		in >> l >> r;
		out << query(1,1,n,l,r).ans << endl;
	}

}

};

int main() {
CanYouAnswerTheseQueriesI solver;
std::istream& in(std::cin);
std::ostream& out(std::cout);
solver.solve(in, out);
return 0;
}

void build(int v, int tl, int tr){
	if(tl == tr){
		t[v] = make_data(a[tl]);
                return ;  // missing this may be the reason your recursion doesn't end :p 
	}

Hope this helps :slight_smile: