#include <bits/stdc++.h>   #pragma GCC optimize(2)   using namespace std;   void read(int &x) {     x = 0;     int f = 1;     char ch = getchar();     for (; !isdigit(ch); ch = getchar())       if (ch ==  - ) f = -f;     for (; isdigit(ch); ch = getchar()) x = x * 10 + ch -  0 ;     x *= f;   }   void print(int x) {     if (x < 0) putchar( - ), x = -x;     if (!x) return;     print(x / 10), putchar(x % 10 + 48);   }   void write(int x) {     if (!x)       putchar( 0 );     else       print(x);     putchar(  n );   }   const int maxn = 1e6 + 10;   const int inf = 1e9;   const double eps = 1e-8;   const int mod = 1e9 + 7;   const int B = 400;   int a[maxn], b[maxn], n, k, q;   int c[maxn], s[maxn], ans, res;   namespace pps {   void modify(int p, int x) {     c[p] = x;     for (int i = p; i <= n; i += k) {       ans -= !(!s[i]);       if (i + k > n) res -= !s[i];       s[i] = c[i] ^ (i >= k ? s[i - k] : 0);       if (i + k > n) res += !s[i];       ans += !(!s[i]);     }   }   void solve() {     ans = n - ans;     while (q--) {       char op;       int p, v;       scanf( %c , &op), read(p), read(v);       if (op ==  a )         a[p] = v;       else         b[p] = v;       modify(p, (a[p] ^ b[p]) ^ (a[p - 1] ^ b[p - 1]));       p++;       modify(p, (a[p] ^ b[p]) ^ (a[p - 1] ^ b[p - 1]));       write(res == k ? ans : -1);     }   }   }  // namespace pps   namespace modpps {   struct block {     vector<int> r, bel, val, w;     vector<vector<int> > t;     int tag[600], m;     void init(int x) {       if (!x) x = k;       m = 0;       for (int i = x; i <= n; i += k) m++;       r.resize(m + 2), bel.resize(m + 2);       val.resize(m + 2), w.resize(m + 2);       for (int i = 1; i <= m; i++) bel[i] = (i - 1) / B + 1;       for (int i = m; i; i--) r[i] = bel[i] == bel[i + 1] ? r[i + 1] : i;       for (int i = 1; i <= m; i++) {         w[i] = s[(i - 1) * k + x];         val[i] = c[(i - 1) * k + x];       }       vector<int> et(1 << 14, 0);       for (int i = 0; i <= bel[m]; i++) t.push_back(et);       for (int i = 1; i <= m; i++) t[bel[i]][w[i]]++;     }     void modify(int x, int v) {       x = x / k + (x % k != 0);       int _ = v ^ val[x];       val[x] = v;       v = _;       res -= tag[bel[m]] == w[m];       for (int i = x; i <= r[x]; i++) {         t[bel[i]][w[i]]--;         if (w[i] == tag[bel[i]]) ans--;         w[i] ^= v;         t[bel[i]][w[i]]++;         if (w[i] == tag[bel[i]]) ans++;       }       for (int i = bel[x] + 1; i <= bel[m]; i++) {         ans -= t[i][tag[i]];         tag[i] ^= v;         ans += t[i][tag[i]];       }       res += tag[bel[m]] == w[m];     }   } s[402];   void solve() {     for (int i = 0; i < k; i++) s[i].init(i);     cerr <<  OK  << endl;     while (q--) {       char op;       int p, v;       scanf( %c , &op), read(p), read(v);       if (op ==  a )         a[p] = v;       else         b[p] = v;       s[p % k].modify(p, (a[p] ^ b[p]) ^ (a[p - 1] ^ b[p - 1]));       p++;       s[p % k].modify(p, (a[p] ^ b[p]) ^ (a[p - 1] ^ b[p - 1]));       write(res == k ? n - ans : -1);       if (q % 10000 == 0) cerr << q << endl;     }   }   }  // namespace modpps   int main() {     int st = clock();     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]);     n++;     for (int i = 1; i <= n; i++) c[i] = (a[i] ^ b[i]) ^ (a[i - 1] ^ b[i - 1]);     for (int i = 1; i <= n; i++)       s[i] = c[i] ^ (i >= k ? s[i - k] : 0), ans += !s[i];     for (int i = n - k + 1; i <= n; i++) res += !s[i];     write(res == k ? n - ans : -1);     if (k > B)       pps ::solve();     else       modpps ::solve();     cerr << (double)(clock() - st) / 1e3 << endl;     return 0;   }