code :
# include <bits/stdc++.h>
# pragma pack ()
using namespace std;
inline int read ()
{
register char in = getchar (), f = 0; register int t = 0;
for (; !isdigit (in); in = getchar ()) if (!(in xor 45)) f = 1;
for (; in >= '0' and in <= '9'; in = getchar ())
t = (t << 1) + (t << 3) + (in ^ 48);
return f ? -t : t;
}
inline void write (register long long x)
{
static int t[25]; register int tp = 0;
if (x == 0) return (void) (puts ("0"));
else if (x < 0) putchar ('-'), x = -x;
while (x) t[++tp] = x % 10, x /= 10;
while (tp) putchar (t[tp--] + '0');
puts ("");
}
# define stdi stdin
# define stdo stdout
const int mod = 1e9 + 7;
struct node
{
mutable int l, r, v;
bool operator < (const node &other) const { return l < other.l; }
node (int l, int r = 0, int v = 0) : l (l), r (r), v (v) {}
};
set <node> tree;
struct NUM
{
int l, r, v;
}q[100012], q1[100012], q2[100012];
int len, len1, len2;
//分裂
inline set <node> :: iterator split (int pos)
{
set <node> :: iterator it = tree.lower_bound (node (pos));
if (it != tree.end () and it -> l == pos) return it; it --;
if (it -> r < pos) return tree.end ();
register const int l = it -> l;
register const int r = it -> r;
register const int v = it -> v;
tree.erase (it);
tree.insert (node (l, pos - 1, v));
return tree.insert (node (pos, r, v)).first;
}
//区间和
long long sum (int l, int r)
{
register long long ret = 0; set <node> :: iterator rr = split (r + 1), ll = split (l), it;
for (it = ll; it != rr; it ++) ret = (ret + (it -> r - it -> l + 1) * it -> v) % mod;
return ret;
}
//区间覆盖
void cover (int l, int r, int k)
{
set <node> :: iterator rr = split (r + 1), ll = split (l);
tree.erase (ll, rr); tree.insert (node (l, r, k));
}
//区间加
void add (int l, int r, int k)
{
set <node> :: iterator rr = split (r + 1), ll = split (l), it;
for (it = ll; it != rr; it ++) it -> v = (it -> v + k) % mod;
}
//复制
void copy (int l1, int r1, int l2, int r2)
{
set <node> :: iterator rr1 = split (r1 + 1), ll1 = split (l1);
set <node> :: iterator rr2 = split (r2 + 1), ll2 = split (l2);
set <node> :: iterator it;
len = 0;
for (it = ll1; it != rr1; it ++)
{
q[++len].l = it -> l;
q[len].r = it -> r;
q[len].v = it -> v;
}
int l, r, v;
tree.erase (ll2, rr2);
for (int i = 1; i <= len; i ++)
{
l = q[i].l - l1 + l2;
r = q[i].r - l1 + l2;
v = q[i].v;
tree.insert (node (l, r, v));
}
}
//交换
void exchange (int l1, int r1, int l2, int r2)
{
set <node> :: iterator rr1 = split (r1 + 1), ll1 = split (l1);
set <node> :: iterator rr2 = split (r2 + 1), ll2 = split (l2);
set <node> :: iterator it;
int l, r, v;
len1 = 0; for (it = ll1; it != rr1; it ++) q1[++ len1].l = it -> l, q1[len1].r = it -> r, q1[len1].v = it -> v;
len2 = 0; for (it = ll2; it != rr2; it ++) q2[++ len2].l = it -> l, q2[len2].r = it -> r, q2[len2].v = it -> v;
tree.erase (ll1, rr1); for (int i = 1; i <= len2; i ++) tree.insert (node (q2[i].l - l2 + l1, q2[i].r - l2 + l1, q2[i].v));
tree.erase (ll2, rr2); for (int i = 1; i <= len1; i ++) tree.insert (node (q1[i].l - l1 + l2, q1[i].r - l1 + l2, q1[i].v));
}
//翻转
void flip (register int l, register int r)
{
set <node> :: iterator rr = split (r + 1), ll = split (l), it;
len = 0;
for (it = ll; it != rr; it ++)
{
q[++len].l = it -> l;
q[len].r = it -> r;
q[len].v = it -> v;
}
tree.erase (ll, rr);
for (int i = 1; i <= len; i ++) tree.insert (node (l + r - q[i].r, l + r - q[i].l, q[i].v));
}
int n = read (), m = read ();
int main()
{
setvbuf (stdi, (char*) calloc (1 << 20, sizeof (char)), _IOFBF, 1 << 20);
setvbuf (stdo, (char*) calloc (1 << 20, sizeof (char)), _IOFBF, 1 << 20);
for (register int i = 1; i <= n; i ++) tree.insert (node (i, i, read ()));
for (register int i = 1; i <= m; i ++)
{
register int op = read (), l, r, l1, r1, l2, r2, v;
len = 0;
len1 = 0;
len2 = 0;
if (op == 1)
{
l = read (), r = read ();
write (sum (l, r));
}
if (op == 2)
{
l = read (), r = read (), v = read ();
cover (l, r, v);
}
if (op == 3)
{
l = read (), r = read (), v = read ();
add (l, r, v);
}
if (op == 4)
{
l1 = read (), r1 = read ();
l2 = read (), r2 = read ();
copy (l1, r1, l2, r2);
}
if (op == 5)
{
l1 = read (), r1 = read ();
l2 = read (), r2 = read ();
exchange (l1, r1, l2, r2);
}
if (op == 6)
{
l = read (), r = read ();
flip (l, r);
}
}
set <node> :: iterator it, ll = tree.begin (), rr = tree.end ();
for (it = ll; it != rr; it ++)
{
for (int j = it -> l; j <= it -> r; j ++)
printf("%d ",it -> v);
}puts("");
}