#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int maxm = 4e5 + 10;
template <typename T>
inline bool read(T &x) {
  x = 0;
  bool neg = 0;
  char c = getchar();
  for (; c < '0' || c > '9'; c = getchar())
    if (c == '-')
      neg = 1;
    else if (c == EOF)
      return 0;
  for (; '0' <= c && c <= '9'; c = getchar()) x = x * 10 + (c ^ 48);
  neg ? (x = -x) : 0;
  return c != EOF;
}
template <typename A, typename... B>
inline bool read(A &x, B &...y) {
  return read(x) && read(y...);
}
map<long long, int> mp;
set<int> st[maxm];
int m;
struct seg {
  int oddmin[maxm << 2], evenmin[maxm << 2], val[maxm << 2];
  void pushup(int rt) {
    oddmin[rt] = min(oddmin[rt << 1], oddmin[rt << 1 | 1]);
    evenmin[rt] = min(evenmin[rt << 1], evenmin[rt << 1 | 1]);
    if (val[rt << 1] && val[rt << 1 | 1] &&
        oddmin[rt << 1] + evenmin[rt << 1 | 1] >= m)
      val[rt] = 1;
    else
      val[rt] = 0;
  }
  void build(int l, int r, int rt) {
    if (l == r) {
      if (l & 1) {
        evenmin[rt] = oddmin[rt] = m;
      } else {
        oddmin[rt] = evenmin[rt] = m;
      }
      val[rt] = 1;
      return;
    }
    int mid = l + r >> 1;
    build(l, mid, rt << 1);
    build(mid + 1, r, rt << 1 | 1);
    pushup(rt);
  }
  void update(int pos, int C, int l, int r, int rt, int flag) {
    if (l == r) {
      if (flag & 1)
        oddmin[rt] = C;
      else
        evenmin[rt] = C;
      if (oddmin[rt] + evenmin[rt] >= m)
        val[rt] = 1;
      else
        val[rt] = 0;
      return;
    }
    int mid = l + r >> 1;
    if (pos <= mid)
      update(pos, C, l, mid, rt << 1, flag);
    else
      update(pos, C, mid + 1, r, rt << 1 | 1, flag);
    pushup(rt);
  }
} tree, tree1;
int main() {
  int n, Q;
  read(n, m, Q);
  tree.build(1, n, 1);
  tree1.build(1, n, 1);
  for (int i = 1; i <= 2 * n; i++) {
    if (i % 2 == 0) {
      st[i].insert(0);
      st[i].insert(2 * m + 2);
    } else {
      st[i].insert(2 * m + 1);
      st[i].insert(-1);
    }
  }
  while (Q--) {
    int x, y;
    read(x, y);
    if (mp[1ll * x * (2 * m + 1) + y]) {
      mp[1ll * x * (2 * m + 1) + y] = 0;
      st[x].erase(y);
    } else {
      mp[1ll * x * (2 * m + 1) + y] = 1;
      st[x].insert(y);
    }
    if (x % 2 == 0) {
      set<int>::iterator it = st[x].end();
      it--;
      it--;
      int num = *(it);
      num = (2 * m - num) / 2;
      tree.update(x / 2, num, 1, n, 1, 0);
      it = st[x].begin();
      it++;
      num = *(it);
      num = (num - 2) / 2;
      tree1.update(x / 2, num, 1, n, 1, 0);
    } else {
      set<int>::iterator it = st[x].begin();
      it++;
      int num = *(it);
      num = (num - 1) / 2;
      tree.update((x + 1) / 2, num, 1, n, 1, 1);
      it = st[x].end();
      it--;
      it--;
      num = *it;
      num = (2 * m - 1 - num) / 2;
      tree1.update((x + 1) / 2, num, 1, n, 1, 1);
    }
    if (tree.val[1])
      printf("YES\n");
    else
      printf("NO\n");
  }
  return 0;
}
