#include <bits/stdc++.h> using namespace std; using ll = long long; #define int ll const int MAXN = 2e5 + 5; #define ls(p) (p << 1) #define rs(p) (p << 1 | 1) struct SegTree { struct Seg { int l, r; int rcnt, ecnt, dcnt, recnt, edcnt, redcnt; } seg[MAXN << 2]; void push_up(int p) { seg[p].rcnt = seg[ls(p)].rcnt + seg[rs(p)].rcnt; seg[p].ecnt = seg[ls(p)].ecnt + seg[rs(p)].ecnt; seg[p].dcnt = seg[ls(p)].dcnt + seg[rs(p)].dcnt; seg[p].recnt = seg[ls(p)].recnt + seg[rs(p)].recnt + seg[ls(p)].rcnt * seg[rs(p)].ecnt; seg[p].edcnt = seg[ls(p)].edcnt + seg[rs(p)].edcnt + seg[ls(p)].ecnt * seg[rs(p)].dcnt; seg[p].redcnt = seg[ls(p)].redcnt + seg[rs(p)].redcnt + seg[ls(p)].recnt * seg[rs(p)].dcnt + seg[ls(p)].rcnt * seg[rs(p)].edcnt; } void build(int l, int r, const string &s, int p) { seg[p].l = l, seg[p].r = r; if (l == r) { seg[p].rcnt = seg[p].ecnt = seg[p].dcnt = 0; if (s[l] == 'r') seg[p].rcnt++; else if (s[l] == 'e') seg[p].ecnt++; else if (s[l] == 'd') seg[p].dcnt++; return; } int mid = (l + r) >> 1; build(l, mid, s, ls(p)); build(mid + 1, r, s, rs(p)); push_up(p); } void update(int pos, char c, int p) { if (seg[p].l == seg[p].r && seg[p].l == pos) { seg[p].rcnt = seg[p].ecnt = seg[p].dcnt = 0; if (c == 'r') seg[p].rcnt = 1; else if (c == 'e') seg[p].ecnt = 1; else if (c == 'd') seg[p].dcnt = 1; return; } int mid = (seg[p].l + seg[p].r) >> 1; if (pos <= mid) update(pos, c, ls(p)); else update(pos, c, rs(p)); push_up(p); } } t1, t2; signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; string s, t; cin >> s >> t; s = " " + s, t = " " + t; t1.build(1, n, s, 1); t2.build(1, n, t, 1); while (q--) { int x; cin >> x; swap(s[x], t[x]); t1.update(x, s[x], 1); t2.update(x, t[x], 1); cout << t1.seg[1].redcnt - t2.seg[1].redcnt << "\n"; } }