#include <bits/stdc++.h>
template <class T>
inline void read(T &res) {
  char ch;
  while (ch = getchar(), !isdigit(ch))
    ;
  res = ch ^ 48;
  while (ch = getchar(), isdigit(ch)) res = res * 10 + ch - 48;
}
template <class T>
inline void put(T x) {
  if (x > 9) put(x / 10);
  putchar(x % 10 + 48);
}
using std::vector;
const int N = 2e5 + 5;
const int M = 450;
const int L = 1 << 14;
int n, K, Q, _sta, ans, apr;
int r[N], b[N], a[N];
struct block {
  int bm, m, S;
  vector<int> cnt[L], tag, bl, br, blen;
  vector<int> bel, pos, sum;
  inline void Query(int opt) {
    for (int i = 0; i <= bm; ++i) ans += (blen[i] - cnt[tag[i]][i]) * opt;
    apr += ((sum[m - 1] ^ tag[bm]) > 0) * opt;
  }
  inline void Build(int x) {
    for (int i = x; i <= n; i += K) pos.push_back(i);
    m = pos.size();
    sum.resize(m);
    bel.resize(m);
    S = _sta * 2 / 3;
    !S ? S = 1 : 0;
    bm = (m + S - 1) / S;
    for (int i = 0; i < m; ++i) sum[i] = r[pos[i]];
    for (int i = 1; i < m; ++i) sum[i] ^= sum[i - 1];
    for (int i = 0; i < m; ++i) bel[i] = i / S;
    bl.resize(bm);
    br.resize(bm);
    blen.resize(bm);
    tag.resize(bm);
    for (int i = 0; i < L; ++i) cnt[i].resize(bm);
    bl[bm = 0] = 0;
    for (int i = 1; i < m; ++i)
      if (bel[i] != bel[i - 1]) br[bm] = i - 1, bl[++bm] = i;
    br[bm] = m - 1;
    for (int i = 0; i <= bm; ++i) {
      blen[i] = br[i] - bl[i] + 1;
      for (int j = bl[i]; j <= br[i]; ++j) ++cnt[sum[j]][i];
    }
    Query(1);
  }
  inline void Modify(int x, int v) {
    int t = bel[x];
    for (int i = x; i <= br[t]; ++i) {
      --cnt[sum[i]][t];
      sum[i] ^= v;
      ++cnt[sum[i]][t];
    }
    for (int i = t + 1; i <= bm; ++i) tag[i] ^= v;
  }
} t[M];
inline void calc(int x, int opt) {
  int res = 0;
  for (int i = x; i <= n; i += K) {
    res ^= r[i];
    if (res > 0) ans += opt;
  }
  if (res > 0) apr += opt;
}
inline void work1() {
  for (int i = 1; i <= K; ++i) calc(i, 1);
  if (apr > 0)
    puts("-1");
  else
    put(ans), putchar('\n');
  char opt;
  for (int i = 1, p, v; i <= Q; ++i) {
    scanf("%c", &opt);
    read(p);
    read(v);
    calc((p - 1) % K + 1, -1);
    if (K != 1) calc(p % K + 1, -1);
    int tmp1, tmp2;
    tmp1 = a[p] ^ b[p];
    (opt == 'a' ? a[p] : b[p]) = v;
    tmp2 = a[p] ^ b[p];
    r[p] ^= tmp1 ^ tmp2;
    r[p + 1] ^= tmp1 ^ tmp2;
    calc((p - 1) % K + 1, 1);
    if (K != 1) calc(p % K + 1, 1);
    if (apr > 0)
      puts("-1");
    else
      put(ans), putchar('\n');
  }
}
inline void work2() {
  for (int i = 1; i <= K; ++i) t[i].Build(i);
  if (apr > 0)
    puts("-1");
  else
    put(ans), putchar('\n');
  char opt;
  for (int i = 1, p, v; i <= Q; ++i) {
    scanf("%s", &opt);
    read(p);
    read(v);
    int p1 = (p - 1) % K + 1, p2 = p % K + 1;
    t[p1].Query(-1);
    if (K != 1) t[p2].Query(-1);
    int tmp = a[p] ^ b[p];
    (opt == 'a' ? a[p] : b[p]) = v;
    tmp ^= a[p] ^ b[p];
    t[p1].Modify((p - 1) / K, tmp);
    t[p2].Modify(p / K, tmp);
    t[p1].Query(1);
    if (K != 1) t[p2].Query(1);
    if (apr > 0)
      puts("-1");
    else
      put(ans), putchar('\n');
  }
}
int main() {
  read(n);
  read(K);
  read(Q);
  for (int i = 1; i <= n; ++i) read(a[i]);
  for (int i = 1; i <= n; ++i) read(b[i]);
  for (int i = 1; i <= n; ++i) r[i] = a[i] ^ b[i];
  for (int i = n; i >= 1; --i) r[i + 1] ^= r[i];
  ++n;
  _sta = sqrt(n);
  if (K > _sta)
    work1();
  else
    work2();
  return 0;
}
