#include <bits/stdc++.h>
int n, m, q;
struct DSU {
  std::vector<int> repr;
  int ile = 0;
  DSU() {}
  DSU(int size) {
    repr.resize(size);
    for (int i = 0; i < (size); ++i) repr[i] = i;
    ile = (int)(repr).size();
  }
  int MakeSet() {
    int ind = (int)(repr).size();
    repr.push_back(ind);
    ile++;
    return ind;
  }
  int Find(int a) {
    if (a == repr[a]) return a;
    return repr[a] = Find(repr[a]);
  }
  bool Union(int a, int b) {
    a = Find(a);
    b = Find(b);
    if (a != b) {
      repr[a] = b;
      ile--;
      return true;
    }
    return false;
  }
};
const int LOG = 17;
int tab[12][1 << LOG];
DSU t[1 << (LOG + 1)];
void go(int v, int lo, int hi) {
  int sz = hi - lo + 1;
  t[v] = DSU(m * sz);
  for (int i = 0; i < (m); ++i) {
    for (int j = 0; j < (sz); ++j) {
      if (i < m - 1 && tab[i][lo + j] == tab[i + 1][lo + j])
        t[v].Union(i * sz + j, (i + 1) * sz + j);
      if (j < sz - 1 && tab[i][lo + j] == tab[i][lo + j + 1])
        t[v].Union(i * sz + j, i * sz + j + 1);
    }
  }
  if (lo != hi) {
    go(v << 1, lo, (lo + hi) / 2);
    go((v << 1) + 1, (lo + hi) / 2 + 1, hi);
  }
}
void build() { go(1, 0, (1 << (LOG)) - 1); }
std::vector<std::pair<std::pair<int, int>, int> > prze;
int get(int a, int b, int v = 1, int lo = 0, int hi = (1 << LOG) - 1) {
  if (a > b) return 0;
  if (a == lo && b == hi) {
    prze.push_back(std::make_pair(std::make_pair(a, b), v));
    return t[v].ile;
  }
  int mid = (lo + hi) / 2;
  return get(a, std::min(mid, b), v << 1, lo, mid) +
         get(std::max(a, mid + 1), b, (v << 1) + 1, mid + 1, hi);
}
int query(int a, int b) {
  prze.clear();
  int ans = get(a, b);
  DSU dsu;
  std::map<std::pair<int, int>, int> map;
  for (int i = 0; i < ((int)(prze).size() - 1); ++i) {
    int fs = prze[i].first.second;
    int sc = prze[i + 1].first.first;
    int sz1 = prze[i].first.second - prze[i].first.first + 1;
    int sz2 = prze[i + 1].first.second - prze[i + 1].first.first + 1;
    auto &ds1 = t[prze[i].second];
    auto &ds2 = t[prze[i + 1].second];
    for (int j = 0; j < (m); ++j) {
      if (tab[j][fs] == tab[j][sc]) {
        std::pair<int, int> aa = std::make_pair(i, ds1.Find(j * sz1 + sz1 - 1));
        std::pair<int, int> bb = std::make_pair(i + 1, ds2.Find(j * sz2));
        if (map.count(aa) == 0) map[aa] = dsu.MakeSet();
        if (map.count(bb) == 0) map[bb] = dsu.MakeSet();
        if (dsu.Union(map[aa], map[bb])) ans--;
      }
    }
  }
  return ans;
}
int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(0);
  std::cin >> m >> n >> q;
  for (int i = 0; i < (m); ++i)
    for (int j = 0; j < (n); ++j) std::cin >> tab[i][j];
  for (int i = 0; i < (m); ++i)
    for (int j = (n); j < (1 << LOG); ++j) tab[i][j] = 1002137;
  build();
  for (int _ = 0; _ < (q); ++_) {
    int l, r;
    std::cin >> l >> r;
    l--;
    r--;
    std::cout << query(l, r) << "\n";
  }
  return 0;
}
