// Mivik 2021.4.9
#include <cstdio>
#include <cstring>
#include <iostream>

#define d isdigit(c)
#define g c=t.get();
#define L return
#define K break
#define A(c,a,b)if(c)a else b;
#define I(c,a)if(c)a;
#define Y goto E
struct MI{private:char bb[1 << 14];FILE*f;char*bs,*be;char e;bool o,l;public:MI():f(stdin),bs(0),be(0){}
#ifdef __linux__
#endif
inline char get(){if(o){o=0;L e;}
#ifdef MIVIK
char c=fgetc(f);I(c==-1,l=1)L c;
#else
I(bs==be,be=(bs=bb)+fread(bb,1,sizeof(bb),f))I(bs==be,{l=1;L-1;})L*bs++;
#endif
}inline void unget(char c){o=1;e=c;}template<class T>inline T read(){T r;*this>r;L r;}template<class T>inline MI&operator>(T&);};template<class T>struct Q{const static bool U=T(-1)>=T(0);inline void operator()(MI&t,T&r)const{r=0;char c;bool y=0;A(U,for(;;){g I(c==-1,Y)I(d,K)},for(;;){g I(c==-1,Y)A(c=='-',{g I(d,{y=1;K;})},I(d,K))})for(;;){I(c==-1,Y)A(d,r=r*10+(c^48);,K)g}t.unget(c);E:;I(y,r=-r)}};template<>struct Q<char>{};template<class T>inline MI&MI::operator>(T&t){Q<T>()(*this,t);L*this;}
#undef d
#undef g
#undef L
#undef K
#undef A
#undef I
#undef Y
template<class T>std::ostream& operator<(std::ostream&out,const T&t){return out<<t;}
#define endl ('\n')
#define P(x) cout<#x" = "<(x)<endl
#define R (cin.read<int>())

using std::cout;

#include <algorithm>
#include <cassert>
#include <vector>

MI cin;

const int $n = 500005;

int n, m;
struct object {
	int x, y;
	inline bool operator<(const object &t) const { return (x == t.x) ? (y < t.y) : (x < t.x); }
	inline bool operator==(const object &t) const { return x == t.x && y == t.y; }
} v[$n];
int vs[$n], vt;
bool rm[$n];
std::vector<int> rx, ry;
namespace bit {
int v[$n];
inline void update(int x, int t) {
	while (x <= vt) {
		v[x] += t;
		x += x & -x;
	}
}
inline int query(int x) {
	int r = 0;
	while (x) {
		r += v[x];
		x &= x - 1;
	}
	return r;
}
} // namespace bit
inline bool solve() {
	const int x = R, y = R;
	object o = { x, y };
	if (*std::lower_bound(v + 1, v + n + 1, o) == o) return 0;
	auto i1 = std::lower_bound(rx.begin(), rx.end(), x), i2 = std::lower_bound(ry.begin(), ry.end(), y);
	if ((i1 != rx.end() && *i1 == x) || (i2 != ry.end() && *i2 == y)) return 1;
	const int nx = x - (i1 - rx.begin()), ny = y - (i2 - ry.begin());
	return nx != ny;
}
int main() {
	cin > n > m;
	for (int i = 1; i <= n; ++i) {
		cin > v[i].x > v[i].y;
		vs[i] = v[i].y;
	}
	std::sort(v + 1, v + n + 1);
	std::sort(vs + 1, vs + n + 1);
	vt = std::unique(vs + 1, vs + n + 1) - vs - 1;
	for (int i = 1; i <= n; ++i) {
		auto [x, y] = v[i];
		const int dy = std::lower_bound(vs + 1, vs + vt + 1, y) - vs;
		const int nx = x - rx.size(), ny = y - bit::query(dy);
		if (nx < ny && !rm[dy])
			rm[dy] = 1, ry.push_back(y), bit::update(dy, 1);
		else if (nx > ny && (rx.empty() || rx.back() != x))
			rx.push_back(x);
	}
	std::sort(ry.begin(), ry.end());
	v[n + 1] = { -1, -1 };
	while (m--) cout < (solve() ? "WIN\n" : "LOSE\n");
}