#include <bits/stdc++.h>
using namespace std;
#define tag "spoj"
#define maxn 1003
#define maxc 207
#define oo 1000000007
#define mid ((l+r)>>1)
#define meset(a,x) memset(a,x,sizeof(a))
#define loop(x) for(int LoOpEr=x;LoOpEr-->0;)
///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

struct BIT2D{

    int m,n;
    vector< vector<int> > bit;

    BIT2D(const int &M,const int &N): m(M), n(N), bit(M+1,vector<int>(N+1)) {};

    void update(int x,int y,const int &val)
    {
        for(;x<=m;x+=x&-x)
            for(int _y=y;_y<=n;_y+=_y&-_y)
                bit[x][_y]+=val;
    }

    int getsum(int x,int y)
    {
        int rep=0;

        for(;x>0;x-=x&-x)
            for(int _y=y;_y>0;_y-=_y&-_y)
                rep+=bit[x][_y];
        return rep;
    }

    int sum(const int &x,const int &y,const int &u,const int &v)
    {
        return (getsum(u,v)-getsum(u,y-1)-getsum(x-1,v)+getsum(x-1,y-1));
    }
};

struct miniBIT2D{

    int m,n;
    vector< vector<int> > node;
    vector< vector<int> > bit;

    miniBIT2D(const int &M,const int &N): m(M), n(N), node(M+1), bit(M+1) {};

    void fakeup(int x,int y)
    {
        for(;x<=m;x+=x&-x)
                node[x].push_back(y);
    }

    void fakeget(int x,int y)
    {
        for(;x>0;x-=x&-x)
            node[x].push_back(y);
    }

    void fake()
    {
        for(int i=1;i<=m;i++)
            sort(node[i].begin(),node[i].end()),
            bit[i].resize(node[i].size()+7);
    }

    void update(int x,int y,const int &val)
    {
        for(;x<=m;x+=x&-x)
            for(int _y=lower_bound(node[x].begin(),node[x].end(),y)-node[x].begin()+1;_y<=node[x].size();_y+=_y&-_y)
                bit[x][_y]+=val;
    }

    int getsum(int x,int y)
    {
        int rep=0;

        for(;x>0;x-=x&-x)
            for(int _y=upper_bound(node[x].begin(),node[x].end(),y)-node[x].begin();_y>0;_y-=_y&-_y)
                rep+=bit[x][_y];
        return rep;
    }

    int sum(const int &x,const int &y,const int &u,const int &v)
    {
        return (getsum(u,v)-getsum(u,y-1)-getsum(x-1,v)+getsum(x-1,y-1));
    }
};

struct query{
    int val;
    int x,y,u,v;
};
int main()
{
    #ifdef dmdd
    freopen(tag".inp","r",stdin); freopen(tag".out","w",stdout);
    #endif // dmdd
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

    int m,n;

    ///bit:
    cin>>m>>n;
    BIT2D bit(m,n);

    for(int i=1,v;i<=m;i++)
        for(int j=1;j<=n;j++)
            cin>>v,bit.update(i,j,v);

    int q,x,y,u,v;
    cin>>q;
    while(q-->0) cin>>x>>y>>u>>v,cout<<bit.sum(x,y,u,v)<<"\n";

    cout<<"-------------\n";
    ///mini:
    cin>>m>>n;
    vector<query> up,get;
    miniBIT2D bitt(m,n);

    for(int i=1,v;i<=m;i++)
        for(int j=1;j<=n;j++)
            cin>>v,bitt.fakeup(i,j),up.push_back({v,i,j,0,0});

    cin>>q;
    while(q-->0)
    {
        cin>>x>>y>>u>>v;
        bitt.fakeget(x-1,y-1);
        bitt.fakeget(x-1,v);
        bitt.fakeget(u,y-1);
        bitt.fakeget(u,v);
        get.push_back({0,x,y,u,v});

    }

    bitt.fake();

    for(const auto &que: up) bitt.update(que.x,que.y,que.val);
    for(const auto &que: get) cout<<bitt.sum(que.x,que.y,que.u,que.v)<<"\n";

    return 0;
}
