#include <bits/stdc++.h>
using namespace std;
template <typename A, typename B>
string to_string(pair<A, B> p);
template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p);
template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p);
string to_string(const string& s) { return '"' + s + '"'; }
string to_string(const char* s) { return to_string((string)s); }
string to_string(bool b) { return (b ? "true" : "false"); }
string to_string(vector<bool> v) {
  bool first = true;
  string res = "{";
  for (int i = 0; i < static_cast<int>(v.size()); i++) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(v[i]);
  }
  res += "}";
  return res;
}
template <size_t N>
string to_string(bitset<N> v) {
  string res = "";
  for (size_t i = 0; i < N; i++) {
    res += static_cast<char>('0' + v[i]);
  }
  return res;
}
template <typename A>
string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto& x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " +
         to_string(get<2>(p)) + ")";
}
template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " +
         to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";
}
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}
template <typename T>
void read(T& x) {
  x = 0;
  char ch = getchar();
  long long f = 1;
  while (!isdigit(ch)) {
    if (ch == '-') f *= -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - 48;
    ch = getchar();
  }
  x *= f;
}
template <typename T, typename... Args>
void read(T& first, Args&... args) {
  read(first);
  read(args...);
}
vector<pair<int, int> > Ops[800080];
int n, m, q, x, y;
map<pair<int, int>, int> Mp;
void add_op(int id, int l, int r, int ql, int qr, pair<int, int> Op) {
  if (ql <= l && r <= qr) {
    Ops[id].push_back(Op);
    return;
  }
  int mid = (l + r) / 2;
  if (ql <= mid) add_op(id * 2, l, mid, ql, qr, Op);
  if (qr > mid) add_op(id * 2 + 1, mid + 1, r, ql, qr, Op);
}
int ok = 1;
set<pair<int, int> > CIA;
set<int> high[200020], low[200020];
struct MaxTree {
  static constexpr int unit = INT_MIN;
  int f(int a, int b) { return max(a, b); }
  vector<int> s;
  int n;
  MaxTree(int n = 0, int def = unit) : s(2 * n, def), n(n) {}
  void update(int pos, int val) {
    for (s[pos += n] = val; pos /= 2;) s[pos] = f(s[pos * 2], s[pos * 2 + 1]);
  }
  int query(int b, int e) {
    int ra = unit, rb = unit;
    for (b += n, e += n; b < e; b /= 2, e /= 2) {
      if (b % 2) ra = f(ra, s[b++]);
      if (e % 2) rb = f(s[--e], rb);
    }
    return f(ra, rb);
  }
} MxT(200020);
struct MinTree {
  static constexpr int unit = INT_MAX;
  int f(int a, int b) { return min(a, b); }
  vector<int> s;
  int n;
  MinTree(int n = 0, int def = unit) : s(2 * n, def), n(n) {}
  void update(int pos, int val) {
    for (s[pos += n] = val; pos /= 2;) s[pos] = f(s[pos * 2], s[pos * 2 + 1]);
  }
  int query(int b, int e) {
    int ra = unit, rb = unit;
    for (b += n, e += n; b < e; b /= 2, e /= 2) {
      if (b % 2) ra = f(ra, s[b++]);
      if (e % 2) rb = f(s[--e], rb);
    }
    return f(ra, rb);
  }
} MiT(200020);
void enact(pair<int, int> A) {
  if (!ok) return;
  CIA.insert(A);
  int x = (A.first + 1) / 2, y = 200000 - (A.second + 1) / 2;
  if (A.first % 2) {
    high[x].insert(y);
    MxT.update(x, *high[x].rbegin());
    int c = MiT.query(x, 200020);
    if (c <= y) ok = 0;
  } else {
    low[x].insert(y);
    MiT.update(x, *low[x].begin());
    int c = MxT.query(1, x + 1);
    if (c >= y) ok = 0;
  }
}
void deenact(pair<int, int> A) {
  if (!CIA.count(A)) return;
  CIA.erase(A);
  int x = (A.first + 1) / 2, y = 200000 - (A.second + 1) / 2;
  if (A.first % 2) {
    high[x].erase(y);
    MxT.update(x, *high[x].rbegin());
  } else {
    low[x].erase(y);
    MiT.update(x, *low[x].begin());
  }
}
void walk(int id, int l, int r) {
  for (auto ct : Ops[id]) enact(ct);
  if (!ok) {
    for (int i = l; i <= r; i++) cout << "NO\n";
  } else {
    if (l == r)
      cout << "YES\n";
    else {
      int mid = (l + r) / 2;
      walk(id * 2, l, mid);
      walk(id * 2 + 1, mid + 1, r);
    }
  }
  ok = 1;
  for (auto ct : Ops[id]) deenact(ct);
}
int main() {
  read(n, m, q);
  for (int i = 1; i <= n; i++) {
    high[i].insert(INT_MIN);
    low[i].insert(INT_MAX);
  }
  for (int i = 1; i <= q; i++) {
    read(x, y);
    if (Mp.count(make_pair(x, y))) {
      add_op(1, 1, q, Mp[make_pair(x, y)], i - 1, make_pair(x, y));
      Mp.erase(make_pair(x, y));
    } else {
      Mp[make_pair(x, y)] = i;
    }
  }
  for (auto ct : Mp) {
    add_op(1, 1, q, ct.second, q, ct.first);
  }
  walk(1, 1, q);
  return 0;
}
