#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

typedef long long lng;
typedef long double ldbl;

lng n, q;
struct line
{
	lng  k;
	ldbl x;
	lng X1, Y1, X2, Y2;
};

line lft[500000], rght[500000], horiz[500000];
lng nl, nr, nh;

int main()
{
	freopen("mountain.in", "r", stdin);
	freopen("mountain.out", "w", stdout);
	scanf("%lld%lld", &n, &q);
	lng curx = 0, cury = 0, ncurx, ncury;
	for (lng i = 0; i < n; ++i)
	{
		lng d, k; scanf("%lld%lld", &d, &k);
		ncurx = curx + lng(d);
		ncury = cury + lng(d) * lng(k);
		line temp = { k, ldbl(ldbl(curx) - ldbl(cury) / ldbl(k)), curx, cury, ncurx, ncury };
		if (k > 0)
			lft[nl++] = temp;
		else if (k < 0)
			rght[nr++] = temp;
		else
			horiz[nh++] = temp;
		curx = ncurx;
		cury = ncury;
	}
	for (lng i = 0; i < q; ++i)
	{
		lng ansleft = 0;
		lng ansright = curx;
		lng x, y; scanf("%lld%lld", &x, &y);
		for (lng j = 0; j < nl; ++j)
		{
			lng YY = lft[j].Y1 + (lng(x) - lft[j].X1) * lft[j].k;
			if (YY > y && lft[j].X2 < x)
				ansleft = max(ansleft, lft[j].X2);
		}
		for (lng j = 0; j < nr; ++j)
		{
			lng YY = rght[j].Y1 + (lng(x) - rght[j].X1) * rght[j].k;
			if (YY > y && rght[j].X1 > x)
			{
				ansright = min(ansright, rght[j].X1);
			}
		}
		for (lng j = 0; j < nh; ++j)
		{
			if (horiz[j].Y1 > y)
			{
				if (horiz[j].X2 < x)
					ansleft = max(ansleft, horiz[j].X2);
				else if (horiz[j].X1 > x)
					ansright = min(ansright, horiz[j].X1);
			}
		}
		printf("%lld %lld\n", ansleft, ansright);
	}
	return 0;
}