0

This is my solution for finding out the maximum sum of a subarray for a given array using Segment Tree (http://www.spoj.com/problems/GSS1/) but I am getting TLE (Time Limit Exceeded error) for this. Can anyone suggest more optimizations for this code?

public class segmentTree {
    int st[];

    segmentTree(int arr[], int n){
        int x = (int)Math.ceil(Math.log(n)/Math.log(2));
        int maxSize = (int)Math.pow(2, x)<<1 - 1;
        st = new int[maxSize];
        constructSTUtil(arr, 0, n-1, 0);
    }
    int getMid(int s, int e) {
        return s + (e - s)>>1;
    }

    int getSumUtil(int ss, int se, int qs, int qe, int si)
    {
        if (qs <= ss && qe >= se)
            return st[si];
        if (se < qs || ss > qe)
            return 0;
        int mid = getMid(ss, se);
        return getSumUtil(ss, mid, qs, qe, si<<1 + 1) +
                getSumUtil(mid + 1, se, qs, qe, si<<1 + 2);
    }
    int getSum(int n, int qs, int qe)
    {
        if (qs < 0 || qe > n - 1 || qs > qe) {
            return -1;
        }
        return getSumUtil(0, n - 1, qs, qe, 0);
    }
    int constructSTUtil(int arr[], int ss, int se, int si)
    {
        if (ss == se) {
            st[si] = arr[ss];
            return arr[ss];
        }
        int mid = getMid(ss, se);
        st[si] = constructSTUtil(arr, ss, mid, si<<1 + 1) +
                 constructSTUtil(arr, mid + 1, se, si<<1 + 2);
        return st[si];
    }

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(in.readLine().trim());
        int array[] = new int[n];
        String arr[] = new String[n];
        arr = in.readLine().split(" ");
        for(int i=0; i<n; i++){
            array[i] = Integer.parseInt(arr[i].trim());
        }
        segmentTree tree = new segmentTree(array, n);
        int m = Integer.parseInt(in.readLine());
        while(m-- > 0){
            String ind[] = new String[2];
            ind = in.readLine().split(" ");
            int x = Integer.parseInt(ind[0].trim());
            int y =Integer.parseInt(ind[1].trim());
            int maxSum = -999999999;
            for(int i=x-1; i<=y-1; i++){
                for(int j=x-1; j<=y-1; j++){
                    if(tree.getSum(n, i, j) > maxSum)
                        maxSum = tree.getSum(n, i, j);
                }
            }
            System.out.println(maxSum);
        }
    }

}
Pindaari
  • 408
  • 4
  • 9

0 Answers0