using System;
class HelloWorld
{
    static long optimalan_put(long [,] matrica, long n, long m)
    {
        long min = 0, min1 = 0, min2 = 0;
        bool moze_levo = false, moze_gore = false;
        if(n-1 >= 0)
        {
            moze_levo = true;
        }
        if(m-1 >=0)
        {
            moze_gore = true;
        }
        if(moze_gore && moze_levo)
        {
            min1 = optimalan_put(matrica, n-1, m);
            min2 = optimalan_put(matrica, n, m-1);
            if(min1 > min2)
            {
                min = min2;
            }
            else
            {
                min = min1;
            }
        }
        else if(moze_gore)
        {
            min = optimalan_put(matrica, n, m-1);
        }
        else if(moze_levo)
        {
            min = optimalan_put(matrica, n-1, m);
        }
        min += matrica[n, m];
        return min;
    }
    
    static bool postoji(long [,] koraci, long k, long x, long y)
    {
        long l = 0, d = k-1, sredina = 0;
        long x_prvi = 0, x_poslednji = 0;
        bool x_postoji = false;
        while(l<=k)
        {
            sredina = (l + d) / 2;
            if(x == koraci[sredina, 0] && x != koraci[sredina-1, 0])
            {
                x_prvi = sredina;
                x_postoji = true;
            }
            else if (x < koraci[sredina, 0])
            {
                d = sredina - 1;
            }
            else
            {
                l = sredina + 1;
            }
        }
        if(x_postoji)
        {
            l = 0; d = k-1;
            while(l<=k)
            {
                sredina = (l + d) / 2;
                if(x == koraci[sredina, 0] && x != koraci[sredina+1, 0])
                {
                    x_poslednji = sredina;
                }
                else if (x < koraci[sredina, 0])
                {
                    d = sredina - 1;
                }
                else
                {
                    l = sredina + 1;
                }
            }
            
            l = x_prvi; d = x_poslednji;
            while(l<=k)
            {
                sredina = (l + d) / 2;
                if(y == koraci[sredina, 1])
                {
                    return true;
                }
                else if (x < koraci[sredina, 0])
                {
                    d = sredina - 1;
                }
                else
                {
                    l = sredina + 1;
                }
            }
        }
        return false;
    }
    
    static long minimalna_suma(long [,] matrica, long n, long m, long x, long y)
    {
        long min = 0, min1 = 0, min2 = 0;
        bool moze_levo = false, moze_gore = false;
        if(n-1 >= 0 && matrica[n-1, m] >= 0 && !(x==0 && n == x+1 && m>=y))
        {
            moze_levo = true;
        }
        if(m-1 >=0 && matrica[n, m-1] >= 0 && !(y==0 && m == y+1 && n>=x))
        {
            moze_gore = true;
        }
        if(moze_gore && moze_levo)
        {
            min1 = minimalna_suma(matrica, n-1, m, x, y);
            min2 = minimalna_suma(matrica, n, m-1, x, y);
            if(min1 > min2)
            {
                min = min2;
            }
            else
            {
                min = min1;
            }
        }
        else if(moze_gore)
        {
            min = minimalna_suma(matrica, n, m-1, x, y);
        }
        else if(moze_levo)
        {
            min = minimalna_suma(matrica, n-1, m, x, y);
        }
        min += matrica[n, m];
        return min;
    }
    
    static void Main()
    {
        string [] ulaz = Console.ReadLine().Split(' ');
        long n = long.Parse(ulaz[0]);
        long m = long.Parse(ulaz[1]);
        long i = 0, j = 0;
        long [,] matrica = new long [n, m]; 
        long [,] najkraci_putevi = new long [n, m];
        for(i=0; i<n; i++)
        {
            ulaz = Console.ReadLine().Split(' ');
            for(j=0; j<m; j++)
            {
                matrica[i, j] = long.Parse(ulaz[j]);
                najkraci_putevi[i, j] = optimalan_put(matrica, i, j);
            }
        }
        
        long k = n+m-1;
        long [,] koraci = new long [k, 2]; 
        long x = n-1, y = m-1, a = 0, b = 0;
        for(i=0; i<n+m-1; i++)
        {
            if(x >= 1)
            {
                a = najkraci_putevi[x-1, y];
            }
            if(y >= 1)
            {
                b = najkraci_putevi[x, y-1];
            }
            if(x >= 1 && y >= 1)
            {
                if(a < b)
                {
                    koraci[i, 0] = x-1;
                    koraci[i, 1] = y;
                    x--;
                }
                else
                {
                    koraci[i, 0] = x;
                    koraci[i, 1] = y-1;
                    y--;
                }
            }
            else if (x >= 1)
            {
                koraci[i, 0] = x-1;
                koraci[i, 1] = y;
                x--;
            }
            else if (y >= 1)
            {
                koraci[i, 0] = x;
                koraci[i, 1] = y-1;
                y--;
            }
        }
        
        
        long Q = long.Parse(Console.ReadLine());
        for(i=0; i<Q; i++)
        {
            ulaz = Console.ReadLine().Split(' ');
            x = long.Parse(ulaz[0]); x--;
            y = long.Parse(ulaz[1]); y--;
            
            if(!postoji(koraci, k, x, y))
            {
                
                Console.WriteLine(najkraci_putevi[n-1, m-1]);
            }
            else
            {
                long rez = matrica[x, y];
                matrica[x, y] = -1;
                Console.WriteLine(minimalna_suma(matrica, n-1, m-1, x, y));
                matrica[x, y] = rez;
            }
        }
    }
}