hi,

i attempted the problem  http://www.spoj.pl/problems/GSS1/

i have the solved the problem using segment trees.....i have the checked my
solution for the most of the cases it is working fine.....but i am getting
WA.......plz tell any case where my code fails !!.....please point out the
bug if any in the code

#include<stdio.h>
//                                SEGEMENT TREE
// this program will make a segment tree of a given array and then perform
the queries on it as asked in the question fo any range

//starting with the function to ionitialise the segement tree


//                        INTIALIZATION
void initialize(int node, int b, int e, int M[], int A[])
{
   if (b == e)
       M[node] = A[b];
   else
  {
//compute the values in the left and right subtrees
       initialize(2 * node, b, (b + e) / 2, M, A);
       initialize(2 * node + 1, (b + e) / 2 + 1, e, M, A);
//search for the minimum value in the first and
//second half of the interval
       if (M[2 * node] >= M[2 * node + 1])
            M[node] = M[2 * node];
       else
            M[node] = M[2 * node + 1];
   }
}


//function for doing query on the segement tree
//                            QUERY

int query(int node, int b, int e, int M[], int A[], int i, int j)
{
    int p1, p2;

//if the current interval doesn't intersect
//the query interval return -1
    if (i > e || j < b)
        return -1;

//if the current interval is included in
//the query interval return M[node]
    if (b >= i && e <= j)
        return M[node];

//compute the minimum position in the
//left and right part of the interval
    p1 = query(2 * node, b, (b + e) / 2, M, A, i, j);
    p2 = query(2 * node + 1, (b + e) / 2 + 1, e, M, A, i, j);

//return the position where the overall
//minimum is
    if (p1 == -1)
        return /*M[node] =*/ p2;
    if (p2 == -1)
        return /*M[node] =*/ p1;
    if (p1 >= p2)
        return /*M[node] =*/ p1;
    return /*M[node] =*/ p2;
}

int A[50000]={0},M[100000]={-1};

int main()
{
    int n,i,j,tc;
    scanf("%d",&n);//now number of elements in the array is known
    for(i=0;i<n;i++)
        scanf("%d",&A[i]);

    //initialize your segement tree now

   initialize(1,0,n-1,M,A);

/*    for(i=0;i<2*n;i++)
            printf("%d  ",M[i]);
       printf("\n");
    */
    //perform the queries here
   scanf("%d",&tc);
    while(tc--)
    {
        scanf("%d%d",&i,&j);
        //perform the query for each interval
       printf("%d\n",query(1,0,n-1,M,A,i-1,j-1));

        //print the maximun value here
    }

return 0;
}





Amol Sharma
Third Year Student
Computer Science and Engineering
MNNIT Allahabad

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to algogeeks@googlegroups.com.
To unsubscribe from this group, send email to 
algogeeks+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.

Reply via email to