Here is the code. If any element in the array becomes greater than 16 then it just produces the wrong output. Looking for someone's help to point out my mistake.
#include<iostream>
using namespace std;
void merge(int A[], int p, int q, int r){
    int n1=q-p+1; // length of first subarray
    int n2=r-q; // length of second subarray
    int L[n1+1], R[n2+1]; // Size is taken n+1 to store sentinal at last
    int i,j,k;
    for(i=0;i<n1;i++){
        L[i]=A[p+i];
    }
    for(j=0;j<n2;j++){
        R[j]=A[q+j+1];
    }
    L[n1+1]=-1; // '-1' is a sentinal
    R[n2+1]=-1;
    i=0,j=0;
    for(k=p;k<r+1;k++){
        if(L[i]<=R[j]){
            A[k]=L[i];
            i=i+1;
        }
        else{
            A[k]=R[j];
            j=j+1;
        }
    }
}
void mergeSort(int arr[], int p, int r){
    int q;
    if(p<r){
        q=(p+r)/2;
        mergeSort(arr,p,q);
        mergeSort(arr,q+1,r);
        merge(arr,p,q,r);
    }
}
int main(){
    int n=8;
    int arr[n]={7,2,1,3,5,6,2,4}; // Not working for arr[i]>16
    mergeSort(arr,0,n-1);
    for(int i=0;i<n;i++){
        cout<<arr[i]<<" ";
    }
return 0;
}
Please review my code and help me find the problem!
