#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int l, r;
mutable int v;
node (int ll, int rr = 0, int vv = 0) {
l = ll, r = rr, v = vv;
}
bool operator < (const node x) const {
return l < x.l;
}
};
vector<node>v;
inline bool cmp(node a, node b) {
return a.v < b.v;
}
set <node> s;
inline set<node>::iterator split (int pos) {
set<node>::iterator 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, v = it->v;
s.erase(it);
s.insert(node(l, pos - 1, v));
return s.insert(node(pos, r, v)).first;
}
inline void assign (int l, int r, int v) {
set<node>::iterator rr = split(r + 1), ll = split(l);
s.erase(ll, rr);
s.insert({l, r, v});
return;
}
inline void add (int l, int r, int v) {
set<node>::iterator rr = split(r + 1), ll = split(l);
for (; ll != rr; ++ ll) ll->v += v;
return;
}
inline int sum (int l, int r, int mod) {
set<node>::iterator rr = split(r + 1), ll = split(l);
int ans = 0;
for (set<node>::iterator i = ll; i != rr; ++ i) {
ans += i->v * (i->r - i->l + 1);
ans %= mod;
}
return ans;
}
inline void copy(int l1, int r1, int l2, int r2) {
set<node>::iterator rr, ll;
set<node>::iterator rrr, lll;
if (l2 > l1) {
rrr = split(r2 + 1), lll = split(l2);
rr = split(r1 + 1), ll = split(l1);
}else{
rr = split(r1 + 1), ll = split(l1);
rrr = split(r2 + 1), lll = split(l2);
}
s.erase(lll, rrr);
v.clear();
for (set<node>::iterator i = ll; i != s.end() && i != rr; ++ i) {
v.push_back(*i);
}
for (int i = 0; i < (int)v.size(); ++ i) {
s.insert(node(l2 + v[i].l - l1, l2 + v[i].r - l1, v[i].v));
}
return;
}
inline void swp(int l1, int r1, int l2, int r2) {
set<node>::iterator rr, ll;
if (l1 > l2) {
split(r1 + 1), split(l1);
rr = split(r2 + 1), ll = split(l2);
}else{
rr = split(r2 + 1), ll = split(l2);
split(r1 + 1), split(l1);
}
v.clear();
for (set<node>::iterator i = ll; i != rr; ++ i) {
v.push_back(*i);
}
copy(l1, r1, l2, r2);
s.erase(s.lower_bound({l1, l1, 0}), s.upper_bound({r1, r1, 0}));
for (int i = 0; i < (int)v.size(); ++ i) {
s.insert(node(l1 + v[i].l - l2, l1 + v[i].r - l2, v[i].v));
}
return;
}
inline void rever(int l, int r) {
set<node>::iterator rr = split(r + 1), ll = split(l);
v.clear();
for (set<node>::iterator i = ll; i != rr; ++ i) v.push_back(*i);
s.erase(ll, rr);
for (int i = 0; i < (int)v.size(); ++ i) {
s.insert(node(r - v[i].l + l, r - v[i].r + l, v[i].v));
}
return;
}
int n, m;
signed main() {
scanf("%lld%lld", &n, &m);
for (int i = 1, a; i <= n; ++ i) {
scanf("%lld", &a);
s.insert(node(i, i, a));
}
while (m -- ) {
int op;
scanf("%lld", &op);
if (op == 1) {
int l, r;
scanf("%lld%lld", &l, &r);
printf("%lld\n", sum(l, r, 1000000007));
} else if (op == 2) {
int l, r, v;
scanf("%lld%lld%lld", &l, &r, &v);
assign(l, r, v);
} else if (op == 3) {
int l, r, v;
scanf("%lld%lld%lld", &l, &r, &v);
add(l, r, v);
} else if (op == 4) {
int l1, r1, l2, r2;
scanf("%lld%lld%lld%lld", &l1, &r1, &l2, &r2);
copy(l1, r1, l2, r2);
} else if (op == 5) {
int l1, r1, l2, r2;
scanf("%lld%lld%lld%lld", &l1, &r1, &l2, &r2);
swp(l1, r1, l2, r2);
} else {
int l, r;
scanf("%lld%lld", &l, &r);
rever(l, r);
}
}
for (int i = 1; i <= n; ++ i) {
printf("%lld ", sum(i, i, 1000000007));
}
return 0;
}
一直 TLE 伴着 RE 伴着 MLE,求助大佬调。