# what's wrong with my code for matchsticks??

can anybody tell me what’s wrong with mine code …i tried to implement range min query algo.
but i can’t figure out what’s wrong it seems correct to me…

``````#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int A[100003],M[300007],C[300007];
void initializem(int node, int b, int e, int M[], int A[], int N)
{
if (b == e)
M[node] = b;
else
{

initializem(2*node, b, (b + e)/2, M, A, N);
initializem(2*node + 1, (b + e)/2 + 1,e, M, A, N);

if (A[M[2 * node]] <= A[M[2 * node + 1]])
M[node] = M[2 * node];
else
M[node] = M[2 * node + 1];
}
}

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

if (i > e || j < b)
return -1;

if (b >= i && e <= j)
return M[node];

p1 = minquery(2*node, b, (b + e)/2, M, A, i, j);
p2 = minquery(2*node + 1, (b + e)/2 + 1, e, M, A, i, j);

if (p1 == -1)
return M[node] = p2;
if (p2 == -1)
return M[node] = p1;
if (A[p1] <= A[p2])
return M[node] = p1;
return M[node] = p2;

}

void initializec(int node, int b, int e, int C[], int A[], int N)
{
if (b == e)
C[node] = b;
else
{

initializec(2*node, b, (b + e)/2, C, A, N);
initializec(2*node + 1, (b + e)/2 + 1, e, C, A, N);

if (A[C[2*node]] >= A[C[2*node + 1]])
C[node] = C[2*node];
else
C[node] = C[2*node + 1];
}
}

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

if (i > e || j < b)
return -1;

if (b >= i && e <= j)
return C[node];

p1 = maxquery(2*node, b, (b + e)/2, C, A, i, j);
p2 = maxquery(2*node + 1, (b + e)/2 + 1, e, C, A, i, j);

if (p1 == -1)
return C[node] = p2;
if (p2 == -1)
return C[node] = p1;
if (A[p1] >= A[p2])
return C[node] = p1;
return C[node] = p2;

}

int main()
{
int n,q,l,r,i,j,k,p;
double b,m1,m;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&A[i]);
}
j=4*n;
for(i=0;i<j;i++)
{
M[i]=-1;
C[i]=-1;
}
initializem(1,0,n-1,M,A,n);
initializec(1,0,n-1,C,A,n);
scanf("%d",&q);

while(q--)
{
scanf("%d%d",&l,&r);
i=minquery(1,0,n-1,M,A,l,r);

j=maxquery(1,0,n-1,C,A,0,l-1);

k=maxquery(1,0,n-1,C,A,r+1,n-1);

m=(A[j]>=A[k])?A[j]:A[k];

m+=A[i];

p=maxquery(1,0,n-1,C,A,l,r);
b=double(A[i])+double(A[p]-A[i])/2;
m1=(b>m)?b:m;
printf("%.1f\n",m1);

}
return 0;
}``````

small question: try l=0,r=n-1;

j=maxquery(1,0,n-1,C,A,0,l-1);

k=maxquery(1,0,n-1,C,A,r+1,n-1);

m=(A[j]>=A[k])?A[j]:A[k];

there might be a issue here as j=-1,k=-1 and so some ambiguous operations

in addition to what @aashish_iitm said, while returning from the functions don’t do return M[node] = p1;
just do return p1;

//