#include <iostream>
#include <vector>
#include <queue>
#include <deque>
int i, j, k;
int brnav=0;
using namespace std;
struct situacije {
	int zabi, zabj;
};
int main() {
	int mat[1000][1000];
	int n, m; cin >> n >> m;
	for (i = 0; i < 100; i++) {
		for (j = 0; j < 100; j++) {
			mat[i][j]=-1;
		}
	}
	for (i = 1; i < n+1; i++) {
		for (j = 1; j < m+1; j++) {
			cin >> mat[i][j];
		}
	}
	int n1;
	cin >> n1;
	deque<situacije> q;
	situacije l;
	for (i = 0; i < n1; i++) {
		cin >> l.zabi >> l.zabj;
		q.push_back(l);
	}
	int pozi = 1, pozj = 1;
	for (int k = 0; k < n1; k++) {
		while (pozi != n && pozj != m)
		{
			if (q.front().zabi != n && q.front().zabj != m) {
				if (mat[pozi + 1][pozj] < mat[pozi][pozj + 1] && mat[pozi + 1][pozj] != -1 && (pozi + 1 != q.front().zabi || pozj != q.front().zabj)) {
					pozi++;
					brnav += mat[pozi][pozj];
				}
				else if (mat[pozi][pozj + 1] != -1 && (pozj + 1 != q.front().zabj || pozi != q.front().zabi)) {
					pozj++;
					brnav += mat[pozi][pozj];
				}
				else {
					pozi++;
					brnav += mat[pozi][pozj];
				}
			}
			else {
				if ((pozi + 1 != n && pozj != m) || (pozi != n && pozj + 1 != m)) {
					if (mat[pozi + 1][pozj] < mat[pozi][pozj + 1] && mat[pozi + 1][pozj] != -1 && !(pozi + 1 == n || pozj == m)) {
						pozi++;
						brnav += mat[pozi][pozj];
					}
					else if (mat[pozi][pozj + 1] != -1 && !(pozj + 1 == m || pozi == n)) {
						pozj++;
						brnav += mat[pozi][pozj];
					}
					else {
						pozi++;
						brnav += mat[pozi][pozj];
					}
				}
				else {
					if (pozi + 1 == n && pozj == m && pozi + 1 != q.front().zabi) {
						pozi++;
						brnav += mat[pozi][pozj];
					}
					else if (pozj + 1 != q.front().zabj) {
						pozj++;
						brnav += mat[pozi][pozj];
					}
					else {
						pozi++;
						brnav += mat[pozi][pozj];
					}
				}
			}
		}
		q.pop_front();
	}
	cout << brnav+mat[n][m] << endl;







}