#include <bits/stdc++.h>
using namespace std;
int a[200000], b[200000], x[200000], n, k;
struct data {
  vector<int> arr, lazy;
  vector<unordered_map<int, int> > M;
  vector<array<int, 1 << 14> > M2;
  int N, B, zeros = 0;
  int init(int n) {
    int i;
    N = n, arr.resize(n), B = 450;
    lazy.resize((n + B - 1) / B, 0);
    if (n > 450) {
      M2.resize((n + B - 1) / B);
      for (i = 0; i < n; i++) M2[i / B][0]++;
    } else {
    }
    zeros = n;
    return 0;
  }
  int update(int i, int x) {
    for (; i < arr.size(); i++) {
      if ((i > 0) && ((i % B) == 0)) break;
      zeros -= (arr[i] == lazy[i / B]);
      if (N > 450)
        M2[i / B][arr[i]]--;
      else {
      }
      arr[i] ^= x;
      zeros += (arr[i] == lazy[i / B]);
      if (N > 450) M2[i / B][arr[i]]++;
    }
    if (i == arr.size()) return 0;
    i /= B;
    for (; B * i < arr.size(); i++) {
      if (N > 450) zeros -= M2[i][lazy[i]];
      lazy[i] ^= x;
      if (N > 450) zeros += M2[i][lazy[i]];
    }
    return 0;
  }
  int getVal(int i) { return arr[i] ^ lazy[i / B]; }
  int getBack() { return getVal(arr.size() - 1); }
};
data d[200000];
int ans = 0, no = 0;
int update(int p, int xx) {
  if (k == 1) {
    ans -= (d[0].arr[p] == 0);
    if (p == n - 1) no -= (d[0].arr[p] == 0);
    d[0].arr[p] ^= xx, ans += (d[0].arr[p] == 0);
    if (p == n - 1) no += (d[0].arr[p] == 0);
  } else if (k == 2) {
    ans -= d[0].zeros, no -= (d[0].getBack() != 0);
    d[0].update(p, xx);
    ans += d[0].zeros, no += (d[0].getBack() != 0);
  } else {
    ans -= d[p % k].zeros;
    if ((p % k) != (n % k)) no -= (d[p % k].getBack() != 0);
    d[p % k].update(p / k, xx);
    ans += d[p % k].zeros;
    if ((p % k) != (n % k)) no += (d[p % k].getBack() != 0);
    if (p + 1 < n) {
      p++;
      ans -= d[p % k].zeros;
      if ((p % k) != (n % k)) no -= (d[p % k].getBack() != 0);
      d[p % k].update(p / k, xx);
      ans += d[p % k].zeros;
      if ((p % k) != (n % k)) no += (d[p % k].getBack() != 0);
    }
  }
  return 0;
}
int main() {
  int i;
  int q, p, v;
  char s;
  scanf("%d %d %d", &n, &k, &q);
  for (i = 0; i < n; i++) scanf("%d", &a[i]);
  for (i = 0; i < n; i++) scanf("%d", &b[i]), x[i] = a[i] ^ b[i];
  if (k == 2)
    d[0].init(n);
  else {
    for (i = 0; i < k; i++) d[i].init((n - i + k - 1) / k);
  }
  ans = n;
  if (k <= 2) {
    for (i = 0; i < n; i++) update(i, x[i]);
  } else {
    for (i = 0; i < n; i++) {
      int p = i, xx = x[i] ^ ((i == 0) ? 0 : x[i - 1]);
      ans -= d[p % k].zeros;
      if ((p % k) != (n % k)) no -= (d[p % k].getBack() != 0);
      d[p % k].update(p / k, xx);
      ans += d[p % k].zeros;
      if ((p % k) != (n % k)) no += (d[p % k].getBack() != 0);
    }
  }
  if (no > 0)
    printf("-1\n");
  else
    printf("%d\n", n - ans);
  for (i = 0; i < q; i++) {
    scanf(" %c %d %d", &s, &p, &v), p--;
    int xx;
    if (s == 'a')
      xx = a[p] ^ v, a[p] = v, x[p] ^= xx;
    else
      xx = b[p] ^ v, b[p] = v, x[p] ^= xx;
    update(p, xx);
    if (no > 0)
      printf("-1\n");
    else
      printf("%d\n", n - ans);
  }
  return 0;
}
