#include <bits/stdc++.h>
using namespace std;
const int V = 1 << 14;
template <typename T>
void pfill(T* pst, const T* ped, T val) {
  for (; pst != ped; *(pst++) = val)
    ;
}
typedef class Chunk {
 private:
  bool inited;

 public:
  int sz, tg;
  int *a, *b;
  Chunk() : inited(false), sz(0), tg(0), a(NULL), b(NULL) {}
  bool append(int);
  void modify(int, int);
  void push_down() {
    if (!tg) return;
    for (int i = 0; i < sz; i++) b[a[i]] = 0;
    for (int i = 0; i < sz; i++) b[a[i] ^= tg]++;
    tg = 0;
  }
  int back() { return (*this)[sz - 1]; }
  int operator[](int p) { return a[p] ^ tg; }
  int operator()(int p) { return b[p ^ tg]; }
} Chunk;
FILE* fin = stdin;
int n, len, q;
int *a, *b, *c;
int lim_sz;
int cnt_zero, cnt_non_zero;
int* end_pos;
vector<Chunk>* ch;
inline void init() {
  fscanf(fin, "%d%d%d", &n, &len, &q);
  a = new int[(n + 1)];
  b = new int[(n + 1)];
  c = new int[(n + 1)];
  for (int i = 0; i < n; i++) {
    fscanf(fin, "%d", a + i);
  }
  for (int i = 0; i < n; i++) {
    fscanf(fin, "%d", b + i);
    c[i] = a[i] ^ b[i];
  }
  for (int i = n - 1; i; i--) c[i] = c[i] ^ c[i - 1];
}
bool Chunk ::append(int x) {
  if (!inited) {
    a = new int[lim_sz];
    b = new int[V];
    pfill(b, b + V, 0);
    inited = true;
  }
  if (sz == lim_sz) return false;
  a[sz++] = x;
  b[x]++;
  return true;
}
void Chunk ::modify(int idx, int val) {
  if (!idx)
    tg ^= val;
  else {
    push_down();
    for (int i = idx; i < sz; i++) {
      b[a[i]]--;
      b[a[i] ^= val]++;
    }
  }
}
void put_ans() { printf("%d\n", (cnt_non_zero) ? (-1) : (n - cnt_zero)); }
char str[5];
namespace small {
inline void solve() {
  end_pos = new int[(len + 1)];
  ch = new vector<Chunk>[(len + 1)];
  for (int i = 0; i < len; i++) ch[i].push_back(Chunk());
  lim_sz = (int)sqrt(n + 0.5);
  for (int i = 0, cid = 0, x; i < n; i++) {
    x = ((i >= len) ? (ch[cid].back().back()) : (0)) ^ c[i];
    if (!ch[cid].back().append(x)) {
      ch[cid].push_back(Chunk());
      ch[cid].back().append(x);
    }
    ++cid;
    if (cid == len) cid = 0;
  }
  int exception = n % len;
  for (int i = 0; i < len; i++) {
    for (auto& b : ch[i]) {
      cnt_zero += b(0);
    }
    if (i ^ exception) cnt_non_zero += !!ch[i].back().back();
  }
  put_ans();
  int p, v, cid, pid, idx;
  while (q--) {
    fscanf(fin, "%s%d%d", str, &p, &v), p--;
    int old_c = a[p] ^ b[p];
    (str[0] == 'a') ? (a[p] = v) : (b[p] = v);
    int ncp = a[p] ^ b[p];
    v = old_c ^ ncp;
    c[p] ^= v;
    cid = p % len;
    pid = p / len / lim_sz;
    idx = (p / len) % lim_sz;
    if (cid != exception) cnt_non_zero -= !!ch[cid].back().back();
    {
      cnt_zero -= ch[cid][pid](0);
      ch[cid][pid].modify(idx, v);
      cnt_zero += ch[cid][pid](0);
    };
    for (int i = pid + 1; i < (signed)ch[cid].size(); i++) {
      cnt_zero -= ch[cid][i](0);
      ch[cid][i].modify(0, v);
      cnt_zero += ch[cid][i](0);
    };
    if (cid != exception) cnt_non_zero += !!ch[cid].back().back();
    if (p + 1 < n) {
      c[p + 1] ^= v;
      cid = (p + 1) % len;
      pid = (p + 1) / len / lim_sz;
      idx = ((p + 1) / len) % lim_sz;
      if (cid != exception) cnt_non_zero -= !!ch[cid].back().back();
      {
        cnt_zero -= ch[cid][pid](0);
        ch[cid][pid].modify(idx, v);
        cnt_zero += ch[cid][pid](0);
      };
      for (int i = pid + 1; i < (signed)ch[cid].size(); i++) {
        cnt_zero -= ch[cid][i](0);
        ch[cid][i].modify(0, v);
        cnt_zero += ch[cid][i](0);
      };
      if (cid != exception) cnt_non_zero += !!ch[cid].back().back();
    }
    put_ans();
  }
}
}  // namespace small
namespace large {
inline void solve() {
  for (int i = len; i < n; i++) c[i] ^= c[i - len];
  for (int i = 0; i < n; i++) cnt_zero += !c[i];
  for (int i = n - len + 1; i < n; i++) cnt_non_zero += !!c[i];
  int exception = n % len;
  put_ans();
  int p, v, cid, lst;
  while (q--) {
    fscanf(fin, "%s%d%d", str, &p, &v), p--;
    int old_c = a[p] ^ b[p];
    (str[0] == 'a') ? (a[p] = v) : (b[p] = v);
    int ncp = a[p] ^ b[p];
    v = old_c ^ ncp;
    cid = p % len;
    lst = (n - cid) / len * len + cid;
    if (cid != exception) cnt_non_zero -= !!c[lst];
    for (int i = p; i < n; i += len) {
      cnt_zero -= !c[i];
      c[i] ^= v;
      cnt_zero += !c[i];
    }
    if (cid != exception) cnt_non_zero += !!c[lst];
    if (p + 1 < n) {
      cid = (p + 1) % len;
      lst = (n - cid) / len * len + cid;
      if (cid != exception) cnt_non_zero -= !!c[lst];
      for (int i = p + 1; i < n; i += len) {
        cnt_zero -= !c[i];
        c[i] ^= v;
        cnt_zero += !c[i];
      }
      if (cid != exception) cnt_non_zero += !!c[lst];
    }
    put_ans();
  }
}
}  // namespace large
inline void solve() {
  int lim = sqrt(n + 0.5);
  if (len <= lim)
    small ::solve();
  else
    large ::solve();
}
int main() {
  init();
  solve();
  return 0;
}
