#include <bits/stdc++.h>
using namespace std;
using namespace std;
const int maxn = 200000 + 10;
const int inf = 1000000000;
pair<int, int> p[maxn];
int n, m, q, val;
struct node {
  int mina, maxb, f;
  node() { mina = inf, maxb = 0, f = 0; }
};
inline node merge(const node& a, const node& b) {
  node c = node();
  c.mina = min(a.mina, b.mina);
  c.maxb = max(a.maxb, b.maxb);
  c.f = a.f + b.f;
  c.f = min(c.f, 1);
  if (a.mina <= b.maxb) c.f = 1;
  return c;
}
set<int> exval[maxn][2];
struct segtree {
  node a[maxn << 2];
  int n, ql, qr, v, k, ans;
  void init(int N) {
    n = N;
    build(1, n, 1);
  }
  void maintain(int l, int r, int o) {
    if (l != r) {
      a[o] = merge(a[o << 1], a[o << 1 | 1]);
    }
  }
  void build(int l, int r, int o) {
    if (l == r) {
      a[o] = node();
      return;
    }
    int mid = l + r >> 1;
    build(l, mid, o << 1), build(mid + 1, r, o << 1 | 1);
    maintain(l, r, o);
  }
  void update(int l, int r, int o) {
    if (l == r) {
      node& e = a[o];
      if (k == 0) {
        if (v == 0)
          exval[l][k].erase(val);
        else
          exval[l][k].insert(val);
      } else {
        if (v == inf)
          exval[l][k].erase(val);
        else
          exval[l][k].insert(val);
      }
      if (exval[l][1].empty())
        e.mina = inf;
      else
        e.mina = *exval[l][1].begin();
      if (exval[l][0].empty())
        e.maxb = 0;
      else
        e.maxb = *exval[l][0].rbegin();
      if (e.mina <= e.maxb)
        e.f = 1;
      else
        e.f = 0;
      assert(e.mina != e.maxb);
      return;
    }
    int mid = l + r >> 1;
    if (ql <= mid) update(l, mid, o << 1);
    if (qr > mid) update(mid + 1, r, o << 1 | 1);
    maintain(l, r, o);
  }
  void Update(int pos, int vv, int kk) {
    k = kk, v = vv;
    ql = pos, qr = pos;
    assert(pos <= n);
    update(1, n, 1);
  }
  void query(int l, int r, int o) {
    if (l == r) {
      if (k == 0)
        ans = a[o].maxb;
      else
        ans = a[o].mina;
    } else {
      int mid = l + r >> 1;
      if (ql <= mid) query(l, mid, o << 1);
      if (qr > mid) query(mid + 1, r, o << 1 | 1);
    }
  }
  int Query() { return a[1].f; }
  int Query(int p, int kk) {
    ql = qr = p;
    k = kk;
    query(1, n, 1);
    return ans;
  }
};
segtree tree;
set<pair<int, int> > has;
inline void solve() {
  tree.init(n);
  for (auto i = (0); i < (q); ++i) {
    int r, c, v;
    tie(r, c) = p[i];
    val = c;
    if (has.count(p[i])) {
      if (r & 1)
        v = inf;
      else
        v = 0;
      has.erase(p[i]);
    } else {
      v = c;
      has.insert(p[i]);
    }
    tree.Update((r + 1) / 2, v, r & 1);
    if (tree.Query() == 1)
      puts("NO");
    else if (tree.Query() == 0)
      puts("YES");
    else
      assert(false);
  }
}
int main(void) {
  scanf("%d%d%d", &n, &m, &q);
  for (auto i = (0); i < (q); ++i) {
    scanf("%d%d", &p[i].first, &p[i].second);
  }
  solve();
  return 0;
}
