//#define _GLIBCXX_DEBUG #include #define FOR(i,a,b) for(ll i=a;i=b;i--) #define per(i,a) ROF(i,a,0) #define pb push_back using namespace std; using ll=long long; using ld=long double; using ch=char; typedef pair P; typedef vector vl; typedef vector vvl; typedef vector

vP; typedef vector vc; typedef vector vvc; const ll MOD=1000000007; const ll MOD2=998244353; const ld PI=acos(-1); const ll INF=1e18; struct edge{ll to,cost;}; struct edge2{ll from,to,cost;}; template bool chmax(T &a, const T& b) { if (a < b) { a = b; return true; } return false; } template bool chmin(T &a, const T& b) { if (a > b) { a = b; return true; } return false; } ll pow_mod(ll x,ll y){ if(y==0){ return 1; } if(y%2==1){ return x*pow_mod(x,y-1)%MOD; } else{ ll t=pow_mod(x,y/2); return t*t%MOD; } } ll inv(ll x){ return pow_mod(x,MOD-2); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int H,W; cin >> H >> W; vvl A(H,vl(W,0)); rep(i,H){ rep(j,W){ cin >> A[i][j]; } } vvl acc0(H,vl(W,0));//yoko; vvl acc1(H,vl(W,0)); ll sum=1; rep(i,H){ rep(j,W){ if(j==0){ acc0[i][j]=A[i][j]; } else{ acc0[i][j]=(acc0[i][j-1]*A[i][j])%MOD; } } } rep(j,W){ rep(i,H){ if(i==0){ acc1[i][j]=A[i][j]; } else{ acc1[i][j]=acc1[i-1][j]*A[i][j]%MOD; } } } rep(i,H){ sum*=acc0[i][W-1]; sum%=MOD; } ll Q; cin >> Q; rep(qq,Q){ ll r,c; cin >> r >> c; r--;c--; cout << (sum*A[r][c])%MOD*(inv(acc0[r][W-1])*inv(acc1[H-1][c])%MOD)%MOD << endl; } }