#include <bits/stdc++.h>
#define pii pair<int,int>
#define f first
#define s second
using namespace std;

struct edge{int a,b,w;};
int cmp(edge A, edge B){return A.w<B.w;}

struct DSU
{
    int f[45];
    void init(){for(int i=0;i<45;i++) f[i]=i;}
    int _find(int x){return x==f[x]?x:f[x]=_find(f[x]);}
    void mrg(int x, int y){f[_find(x)]=_find(y);}
}D;

vector<edge> v;
vector<int> g[45];

int mat[255][255];

struct Seg
{
    int t[4*250];
    void init(int node, int st, int en, int id)
    {
        if(st==en)
        {
            t[node]=mat[id][st];
            return;
        }
        int mid=(st+en)/2;
        init(2*node,st,mid,id);
        init(2*node+1,mid+1,en,id);
        t[node]=min(t[2*node],t[2*node+1]);
    }
    int get(int node, int st, int en, int l, int r)
    {
        if(st>en||l>en||r<st) return 1e9+8;
        if(l<=st&&en<=r) return t[node];
        int mid=(st+en)/2;
        return min(get(2*node,st,mid,l,r),get(2*node+1,mid+1,en,l,r));
    }
}T[255];

struct Seg2D
{
    Seg tt[4*250];
    void initt(){for(int i=0;i<4*250;i++) tt[i]=T[i];}
    int gett(int node, int st, int en, int l, int r, int ll, int rr)
    {
        if(st>en||l>en||r<st) return 1e9+8;
        if(l<=st&&en<=r) return tt[node].get(1,1,250,ll,rr);
        int mid=(st+en)/2;
        return min(gett(2*node,st,mid,l,r,ll,rr),gett(2*node+1,mid+1,en,l,r,ll,rr));
    }
}TT;


void Resi(int N, int R, int C, int Q, int** U, int** V, int** W, int* X1, int* Y1, int* X2, int* Y2, int* O)
{
    for(int i=1;i<=R;i++) for(int j=1;j<=C;j++) mat[i][j]=W[i][j];
    int idi=0;
    if(R<=100 && Q<=100 && C<=100)
    {
        for(int h=1;h<=Q;h++)
        {
            D.init();
            for(int i=1;i<=N;i++) g[i].clear();
            v.clear();
            for(int i=X1[h];i<=X2[h];i++)
            {
                for(int j=Y1[h];j<=Y2[h];j++)
                {
                    int t1=U[i][j];
                    int t2=V[i][j];
                    int t3=W[i][j];
                    edge tmp;
                    tmp.a=t1;
                    tmp.b=t2;
                    tmp.w=t3;
                    v.push_back(tmp);
                }
            }
            sort(v.begin(),v.end(),cmp);
            int res=0;
            for(int i=0;i<v.size();i++)
            {
                int A=v[i].a;
                int B=v[i].b;
                if(D._find(A)!=D._find(B))
                {
                    D.mrg(A,B);
                    res+=v[i].w;
                }
            }
            int ok=1;
            for(int i=1;i<=N;i++) for(int j=1;j<=N;j++)
            {
                if(D._find(i)!=D._find(j)) ok=0;
            }
            if(!ok) O[++idi]=-1;
            else O[++idi]=res;
        }
    }
    if(N==2)
    {
        for(int i=1;i<=R;i++) T[i].init(1,1,C+1,i);
        TT.initt(); 
        for(int h=1;h<=Q;h++)
        {
            //int res=nadji(X1[h],Y1[h],X2[h],Y2[h]);
            int res=TT.gett(1,1,R,X1[h],X2[h],Y1[h],Y2[h]);
            O[++idi]=res;
        }
    }
    /*if(N==3)
    {
        for(int h=1;h<=Q;h++)
        {
            int res=1e9+8;
            int t12=
            int t23=
            int t13=
            int res=min(res,t12+t23);
            int res=min(res,t12+t13);
            int res=min(res,t23+t13);
            if(res==1e9+8) O[++idi]=-1;
            else O[++idi]=res;
        }
    }*/
}