WA on #2 #3 #8 #10
src 如下
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
constexpr ll MOD = 1e9 + 7, N = 3e5 + 2;
ll n, m;
/* ODT */
struct Node_t {
ll l, r;
mutable ll v;
Node_t(const ll &_l, const ll &_r, const ll &_v) : l(_l), r(_r), v(_v) {}
Node_t() = default;
bool operator<(const Node_t &b) const { return l < b.l; }
};
set<Node_t> odt;
auto split(ll x) {
if (x > n) return odt.end();
auto it = --odt.upper_bound({x, 0, 0});
if (it->l == x) return it;
auto l = it->l, r = it->r, v = it->v;
odt.erase(it);
odt.emplace(l, x - 1, v);
return odt.emplace(x, r, v).first;
}
void assign(ll l, ll r, ll v) {
auto itr = split(r + 1), itl = split(l);
odt.erase(itl, itr);
odt.emplace(l, r, v);
}
void add(ll l, ll r, ll v) {
auto itr = split(r + 1), itl = split(l);
for (; itl != itr; ++itl) {
itl->v = (itl->v + v) % MOD;
}
}
ll sum(ll l, ll r) {
auto itr = split(r + 1), itl = split(l);
ll res = 0;
for (; itl != itr; ++itl) {
res = (res + itl->v * (itl->r - itl->l + 1)) % MOD;
}
return res;
}
Node_t tmp[N], tmp2[N];
void rvrs(ll l, ll r) {
auto itr = split(r + 1), itl = split(l);
ll top = 0;
for (auto it = itl; it != itr; ++it) {
tmp[++top] = *it;
}
odt.erase(itl, itr);
for (ll i = 1; i <= top; ++i) {
odt.emplace(l + r - tmp[i].r, l + r - tmp[i].l, tmp[i].v);
}
}
void copy(ll l1, ll r1, ll l2, ll r2) {
auto itr1 = split(r1 + 1), itl1 = split(l1);
ll top = 0;
for (auto it = itl1; it != itr1; ++it) {
tmp[++top] = *it;
}
auto itr2 = split(r2 + 1), itl2 = split(l2);
odt.erase(itl2, itr2);
for (ll i = 1; i <= top; ++i) {
odt.emplace(tmp[i].l - l1 + l2, tmp[i].r - r1 + r2, tmp[i].v);
}
}
void swap(ll l1, ll r1, ll l2, ll r2) {
auto itr1 = split(r1 + 1), itl1 = split(l1);
ll top = 0, top2 = 0;
for (auto it = itl1; it != itr1; ++it) {
tmp[++top] = *it;
}
auto itr2 = split(r2 + 1), itl2 = split(l2);
for (auto it = itl2; it != itr2; ++it) {
tmp2[++top2] = *it;
}
itr1 = split(r1 + 1);
itl1 = split(l1);
odt.erase(itl1, itr1);
itr2 = split(r2 + 1);
itl2 = split(l2);
odt.erase(itl2, itr2);
for (ll i = 1; i <= top; ++i) {
odt.emplace(tmp[i].l - l1 + l2, tmp[i].r - r1 + r2, tmp[i].v);
}
for (ll i = 1; i <= top2; ++i) {
odt.emplace(tmp2[i].l - l2 + l1, tmp2[i].r - r2 + r1, tmp2[i].v);
}
}
void print() {
for (auto it = odt.begin(); it != odt.end() && it->r <= n; ++it) {
for (ll i = it->l; i <= it->r; ++i) {
cout << it->v << " ";
}
}
}
/* MAIN */
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> m;
for (ll i = 1, x; i <= n; ++i) {
cin >> x;
odt.emplace(i, i, x);
}
odt.emplace(n + 1, n + 1, 0);
for (ll i = 1, op, l1, r1, l2, r2, v; i <= m; ++i) {
cin >> op;
switch (op) {
case 1:
cin >> l1 >> r1;
cout << sum(l1, r1) << endl;
break;
case 2:
cin >> l1 >> r1 >> v;
assign(l1, r1, v);
break;
case 3:
cin >> l1 >> r1 >> v;
add(l1, r1, v);
break;
case 4:
cin >> l1 >> r1 >> l2 >> r2;
copy(l1, r1, l2, r2);
break;
case 5:
cin >> l1 >> r1 >> l2 >> r2;
swap(l1, r1, l2, r2);
break;
case 6:
cin >> l1 >> r1;
rvrs(l1, r1);
break;
}
}
print();
return 0;
}