不知道哪里写假了……但样例能过
```cpp
#include <iostream>
#include <set>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
struct node{
mutable int l, r;
mutable bool val;
node(int l_, int r_, bool val_): l(l_), r(r_), val(val_) {}
node(int L): l(L) {}
bool operator <(const node &o) const {
return l < o.l;
}
};
set<node> s;
typedef set<node>::iterator IT;
int n, m;
IT split(int pos) {
IT it = s.lower_bound(node(pos));
if(it != s.end() && it->l == pos) return it;
--it;
if(it->r < pos) return s.end();
int l = it->l, r = it->r;
bool v = it->val;
s.erase(it);
s.insert(node(l, pos - 1, v));
return s.insert(node(pos, r, v)).first;
}
IT assign(int l, int r, bool k) {
IT itr = split(r + 1), itl = split(l);
s.erase(itl, itr);
return s.insert(node(l, r, k)).first;
}
void change1(int l, int r) {
IT itr = split(r), itl = split(l);
for(register IT it = itl; it != itr; ++it) {
if(it->val) it->l--, it->l = max(1, it->l);
else it->r--;
}
}
void change2(int l, int r) {
IT itr = split(r + 1), itl = split(l + 1);
for(register IT it = itl; it != itr; ++it) {
if(it->val) it->r++;
else it->l++;
}
}
void change3(int l, int r) {
IT itr = split(r), itl = split(l);
for(register IT it = itl; it != itr; ++it) {
if(it->val) it->r--;
else it->l--, it->l = max(1, it->l);
}
}
void change4(int l, int r) {
IT itr = split(r + 1), itl = split(l + 1);
for(register IT it = ++itl; it != itr; ++it) {
if(it->val) it->l++;
else it->r++;
}
}
void update() {
IT it2 = s.begin();
++it2;
for(register IT it1 = s.begin(); it2 != s.end(); ) {
if(it1->l > it1 -> r || it1->r == 0) it2 = it1 = s.erase(it1), it2++;
else {
if(it1->val == it2->val) {
it2 = it1 = assign(it1->l, it2->r, it1->val);
++it2;
continue;
}
++it1, ++it2;
}
}
}
int get_sum(int l, int r) {
IT itr = split(r + 1), itl = split(l);
int res = 0;
for(register IT it = itl; it != itr; ++it) {
res += it->val * (it->r - it->l + 1);
}
return res;
}
int main() {
int ans = 0;
scanf("%d%d", &n, &m);
int las, a, laspos = 1;
scanf("%d", &las);
a = las;
for(int i = 2; i <= n; i++) {
scanf("%d", &a);
if(a != las) {
s.insert(node(laspos, i - 1, las));
las = a, laspos = i;
}
}
s.insert(node(laspos, n, a));
// puts("---------");
// for(auto i : s) printf("%d %d %d\n", i.l, i.r, i.val);
// puts("---------");
int op, l, r;
while(m--) {
scanf("%d%d%d", &op, &l, &r);
l = l ^ ans;
r = r ^ ans;
if(l > r) swap(l, r);
if(op == 1) {
assign(l, r, 0);
}
else if(op == 2) {
assign(l, r, 1);
}
else if(op == 3) {
change1(l, r);
}
else if(op == 4) {
change2(l, r);
}
else if(op == 5) {
change3(l, r);
}
else if(op == 6) {
change4(l, r);
}
else {
ans = get_sum(l, r);
printf("%d\n", ans);
}
update();
update();
// puts("---------");
// for(auto i : s) printf("%d %d %d\n", i.l, i.r, i.val);
// puts("---------");
}
return 0;
}
/*
5 7
1 0 0 0 1
3 3 4
6 2 4
2 1 2
1 3 5
1 1 5
7 5 1
2 5 2
*/