T1~T3:WA T4~T5:OLE T6~T10:TLE 样例能过
#include <bits/stdc++.h>
#define It set<ODT>::iterator
#define swap my_swap
inline void my_swap(long long &x, long long &y) {
x ^= y ^= x ^= y;
return;
}
using namespace std;
typedef long long ll;
const int N = 3e5 + 10;
const int MOD = 1e9 + 7;
struct ODT {
ll l, r;
mutable ll val;
ODT(ll _l = 0, ll _r = 0, ll _val = 0):l(_l), r(_r), val(_val) {return;}
bool operator < (const ODT &x)const {
return l < x.l;
}
} a[N], b[N];
void clear(ODT c[]) {
return;
}
set<ODT> tree;
inline It split(ll x) {
It it = tree.lower_bound(ODT(x));
if (it != tree.end() && it->l == x) return it;
it--;
ll l = it->l, r = it->r, val = it->val;
tree.erase(it);
tree.insert(ODT(l, x - 1, val));
return tree.insert(ODT(x, r, val)).first;
}
inline void assign(ll l, ll r, ll val) {
It itr = split(r + 1), itl = split(l);
tree.erase(itl,itr);
tree.insert(ODT(l,r,val));
return;
}
inline ll query(ll l, ll r) {
It itr = split(r + 1), itl = split(l);
ll sum = 0;
for (It it = itl; it != itr; it++) {
sum = (sum % MOD + (it->val % MOD * (it->r - it->l + 1) % MOD) % MOD) % MOD;
}
return sum;
}
inline void add(ll l, ll r, ll val) {
It itr = split(r + 1), itl = split(l);
for (It it = itl; it != itr; it++) {
it->val = (it->val % MOD + val % MOD) % MOD;
}
return;
}
inline void Copy(ll l1, ll r1, ll l2, ll r2) {
It itr1 = split(r1 + 1), itl1 = split(l1);It itr2 = split(r2 + 1), itl2 = split(l2);
tree.erase(itl2, itr2);
for (It it = itl1; it != itr1; it++)
tree.insert(ODT(it->l - l1 + l2, it->r - l1 + l2, it->val));
return;
}
inline void SWAP1(ll l1, ll r1, ll l2, ll r2) {
It itr1 = split(r1 + 1);
It itl1 = split(l1);
int c = l2 - l1;
int cnt1 = 0, cnt2 = 0;
for (It it = itl1; it != itr1; it++) {
a[++cnt1] = ODT(it->l, it->r, it->val);
}
tree.erase(itl1, itr1);
It itr2 = split(r2 + 1);
It itl2 = split(l2);
for (It it = itl2; it != itr2; it++) {
b[++cnt2] = ODT(it->l, it->r, it->val);
}
tree.erase(itl2, itr2);
for (int i = 1; i <= cnt2; i++)
tree.insert(ODT(b[i].l - c, b[i].r - c, b[i].val));
for (int i = 1; i <= cnt1; i++)
tree.insert(ODT(a[i].l + c, a[i].r + c, a[i].val));
for (int i = 1; i <= cnt1; i++)
a[i] = ODT();
for (int i = 1; i <= cnt2; i++)
b[i] = ODT();
return;
}
inline void reverse(ll l, ll r) {
int cnt = 0;
It itr = split(r + 1), itl = split(l);
for (It it = itl; it != itr; it++) {
a[++cnt] = ODT(it->l, it->r, it->val);
}
tree.erase(itl, itr);
for (int i = 1; i <= cnt; i++)
tree.insert(ODT(r + l - a[i].r, r + l - a[i].l, a[i].val));
for (int i = 1; i <= cnt; i++)
a[i] = ODT();
return;
}
int n, m;
ll x;
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> m >> x;
ll lst = x;
int lstl = 1;
for (int i = 2; i <= n; i++) {
cin >> x;
if (x != lst) {
tree.insert(ODT(lstl, i - 1, lst));
lst = x;
lstl = i;
}
}
tree.insert(ODT(lstl, n, lst));
for (int i = 1,op; i <= m; i++) {
ll l, r, l1, r1;
cin >> op >> l >> r;
if (l > r)
swap(l, r);
switch (op) {
case 1: {
cout << query(l, r) << endl;
break;
}
case 2: {
cin >> l1;
assign(l, r, l1);
break;
}
case 3: {
cin >> l1;
add(l, r, l1);
break;
}
case 4: {
cin >> l1 >> r1;
if (l1 > r1)
swap(l1, r1);
Copy(l, r, l1, r1);
break;
}
case 5: {
cin >> l1 >> r1;
if (l1 > r1)
swap(l1, r1);
if (l > l1) {
swap(l, l1);
swap(r, r1);
}
SWAP1(l, r, l1, r1);
break;
}
default: {
reverse(l, r);
break;
}
}
}
for (It it = tree.begin(); it != tree.end(); it++) {
for (int i = it->l; i <= it->r; i++)
cout << it->val % MOD << ' ';
}
return 0;
}