rt,只A了一个Hack
#include <bits/stdc++.h>
using namespace std;
struct node {
int l, r;
char tp;
node(int _l, int _r, char _tp) {
l = _l, r = _r, tp = _tp;
}
};
bool operator <(node a, node b) {
if (a.l != b.l) {
return a.l < b.l;
}
if (a.r != b.r) {
return a.r < b.r;
}
return a.tp < b.tp;
}
set<node> tree;
auto find(int x) {
auto it = --tree.upper_bound(node(x, 1919810, 'X'));
return it;
}
void split(int x) {
auto p = find(x);
int l = p->l, r = p->r;
char tp = p->tp;
tree.erase(p);
tree.insert(node(l, x - 1, tp));
tree.insert(node(x, r, tp));
}
void assign(int l, int r, char tp) {
split(l), split(r + 1);
auto lp = find(l), rp = ++find(r);
tree.erase(lp, rp);
tree.insert(node(l, r, tp));
}
char get(int l, int r) {
auto lp = find(l), rp = find(r);
// cerr << "get " << l << "," << r << ":" << endl;
// cerr << lp->l << " " << lp->r << " " << lp->tp << endl;
// cerr << rp->l << " " << rp->r << " " << rp->tp << endl;
if (lp == rp) {
return lp->tp;
} else {
return '?';
}
}
char s[500005];
int main() {
int n;
scanf("%d", &n);
scanf("%s", s);
int lst = 0;
for (int i = 1; i < n + 1; i++) {
if (s[i] != s[lst]) {
tree.insert(node(lst, i - 1, s[lst]));
lst = i;
}
}
int q;
scanf("%d", &q);
while (q--) {
char op[5];
scanf("%s", op);
if (op[0] == 'A') {
int l, r;
char tp[5];
scanf("%d %d %s", &l, &r, tp);
l--, r--;
assign(l, r, tp[0]);
} else {
int l, r;
scanf("%d %d", &l, &r);
l--, r--;
// for (node x : tree) {
// cerr << x.l << " " << x.r << " " << x.tp << endl;
// }
if (get(l, r) != '?' && (l == 0 || r == n - 1 || get(l - 1, l - 1) != get(r + 1, r + 1))) {
puts("Yes");
} else {
puts("No");
}
}
}
}