int query(Node* curr, int row1, int row2, int col1, int col2, int qRow1, int qRow2, int qCol1, int qCol2)
{
    if (row1 > row2 || col1 > col2)return 0;
    if(qRow1 > row2 || qRow2 < row1 || qCol1 > col2 || qCol2 < col1)return 0;
    if(qRow1 <= row1 && qCol1 <= col1 && qRow2 >= row2 && qCol2 >= col2)return curr->sum;
    int rMid = row1 + (row2 - row1) / 2, cMid = col1 + (col2 - col1) / 2;
    int res = query(curr->children[0], row1, rMid, col1, cMid, qRow1, qRow2, qCol1, qCol2);
    res += query(curr->children[1], row1, rMid, cMid + 1, col2, qRow1, qRow2, qCol1, qCol2); 
    res += query(curr->children[2], rMid + 1, row2, col1, cMid, qRow1, qRow2, qCol1, qCol2);
    res += query(curr->children[3], rMid + 1, row2, cMid + 1, col2, qRow1, qRow2, qCol1, qCol2);
    return res;
}