#include <vector> 
#include <list> 
#include <map> 
#include <set> 
#include <deque> 
#include <queue> 
#include <stack> 
#include <bitset> 
#include <algorithm> 
#include <functional> 
#include <numeric> 
#include <utility> 
#include <sstream> 
#include <iostream> 
#include <iomanip> 
#include <cstdio> 
#include <cmath> 
#include <cstdlib> 
#include <cctype> 
#include <string> 
#include <cstring> 
#include <ctime> 

using namespace std;

#define _int64 long long

int neigh[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

char a[3000][3000];
int h[3000][3000];
pair<int,int> p[3000][3000];
int used[3000][3000];
int m,n;
int cnt[4][3000][3000];

/*
int doit(int x1,int y1,int x2,int y2,int dx,int dy)
{
  int i,j,x,y;
  int ret;
  ret=0;
  for (i=x1;i<=x2;i++)
    for (j=y1;j<=y2;j++)
    {
      x=i+dx;
      y=j+dy;
      if ((x>=0)&&(x<m)&&(y>=0)&&(y<m))
      {
        if (p[i][j]==make_pair(x,y)) ret++;
      }
    }
  return ret;
}
*/

void doit()
{
  int i,j,k,l,x,y;
  for (k=0;k<4;k++)
    for (i=0;i<m;i++)
      for (j=0;j<n;j++)
      {
        cnt[k][i][j]=0;
        if (neigh[k][0]==0)
        {
          if (i>0)
            cnt[k][i][j]+=cnt[k][i-1][j];
        }
        else
        {
          if (j>0)
            cnt[k][i][j]+=cnt[k][i][j-1];
        }
        if (a[i][j]=='1')
        {
          x=i+neigh[k][0];
          y=j+neigh[k][1];
          if ((x>=0)&&(x<m)&&(y>=0)&&(y<n)&&(a[x][y]=='1'))
          {
            if (p[i][j]==make_pair(x,y)) cnt[k][i][j]++;
          }
        }
      }
}

int main()
{
  int i,j,k,l,qq,x,y,ans,x1,y1,x2,y2,tmp;
  vector<pair<int,int> > q;
  scanf("%d%d%d",&m,&n,&qq);
  for (i=0;i<m;i++)
    scanf("%s",a[i]);
  memset(used,0,sizeof(used));
  memset(h,0,sizeof(h));
  for (i=0;i<m;i++)
    for (j=0;j<n;j++)
      if ((a[i][j]=='1')&&(used[i][j]==0))
      {
        q.clear();
        q.push_back(make_pair(i,j));
        p[i][j]=make_pair(-1,-1);
        used[i][j]=1;
        for (k=0;k<q.size();k++)
        {
          x=q[k].first;
          y=q[k].second;
          for (l=0;l<4;l++)
          {
            x1=x+neigh[l][0];
            y1=y+neigh[l][1];
            if ((x1>=0)&&(x1<m)&&(y1>=0)&&(y1<n)&&(used[x1][y1]==0)&&(a[x1][y1]=='1'))
            {
              used[x1][y1]=1;
              p[x1][y1]=q[k];
              q.push_back(make_pair(x1,y1));
            }
          }
        }
        //cout<<q.size()<<endl;
        h[i][j]++;
      }
  /*
  for (i=0;i<m;i++)
  {
    for (j=0;j<n;j++)
      cout<<h[i][j]<<" ";
    cout<<endl;
  }*/
  for (i=0;i<m;i++)
    for (j=0;j<n;j++)
    {
      if (i>0) h[i][j]+=h[i-1][j];
      if (j>0) h[i][j]+=h[i][j-1];
      if ((i>0)&&(j>0)) h[i][j]-=h[i-1][j-1];
    }
  doit();
  for (i=0;i<qq;i++)
  {
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    x1--;y1--;x2--;y2--;
    ans=h[x2][y2];
    if (x1>0) ans-=h[x1-1][y2];
    if (y1>0) ans-=h[x2][y1-1];
    if ((x1>0)&&(y1>0)) ans+=h[x1-1][y1-1];
    //cout<<"h:"<<ans<<endl;
    tmp=cnt[0][x2][y2];
    if (x1>0) tmp-=cnt[0][x1-1][y2];
    ans+=tmp;

    tmp=cnt[1][x2][y2];
    if (y1>0) tmp-=cnt[1][x2][y1-1];
    ans+=tmp;

    tmp=cnt[2][x2][y1];
    if (x1>0) tmp-=cnt[2][x1-1][y1];
    ans+=tmp;

    tmp=cnt[3][x1][y2];
    if (y1>0) tmp-=cnt[3][x1][y1-1];
    ans+=tmp;
    /*
    ans+=doit(x1,y1,x1,y2,-1,0);
    ans+=doit(x2,y1,x2,y2,1,0);
    ans+=doit(x1,y1,x2,y1,0,-1);
    ans+=doit(x1,y2,x2,y2,0,1);
    */
    printf("%d\n",ans);
  }
  return 0;
}

Measured memory_bytes: 247392