#include<stdio.h>
#include<string>
using namespace std;
const int N = 1e5 + 5;
const int mod = 10007;
int ls(int p) { return p << 1; }
int rs(int p) { return p << 1 | 1; }
int t[N << 2];
bool flag[N << 2];
void Union(int p)
{
if (!flag[ls(p)] || !flag[rs(p)]) flag[p] = 0;
else if (t[ls(p)] != t[rs(p)]) flag[p] = 0;
else flag[p] = 1, t[p] = t[ls(p)];
}
void pushdown(int p)
{
if (!flag[p]) return;
flag[ls(p)] = flag[rs(p)] = 1;
t[ls(p)] = t[rs(p)] = t[p];
flag[p] = 0;
}
void update(int p, int tl, int tr, int l, int r, int v, int op)
{
if (tr < l || tl > r) return;
if (tl >= l && tr <= r && flag[p])
{
if (op == 1)
t[p] = (t[p] % mod + v % mod) % mod;
else if (op == 2)
t[p] = t[p] % mod * (v % mod) % mod;
else t[p] = v % mod;
return;
}
pushdown(p);
int mid = (tl + tr) >> 1;
if (l <= mid) update(ls(p), tl, mid, l, r, v, op);
if (r > mid) update(rs(p), mid + 1, tr, l, r, v, op);
Union(p);
}
int query(int p, int tl, int tr, int l, int r, int v)
{
if (tr < l || tl > r) return 0;
if (tl >= l && tr <= r && flag[p])
{
int sum = 1;
for (int i = 1; i <= v; i++) sum = sum % mod * (t[p] % mod) % mod;
sum = sum * (tr - tl + 1) % mod;
return sum;
}
pushdown(p);
int mid = (tl + tr) >> 1;
return (query(ls(p), tl, mid, l, r, v) + query(rs(p), mid + 1, tr, l, r, v)) % mod;
}
int main()
{
int n, m;
while (scanf("%d %d", &n, &m) && n && m)
{
memset(t, 0, sizeof(t));
memset(flag, 1, sizeof(flag));
while (m--)
{
int op, x, y, z;
scanf("%d %d %d %d", &op, &x, &y, &z);
if (op == 4)
printf("%d\n", query(1, 1, n, x, y, z));
else update(1, 1, n, x, y, z, op);
}
}
return 0;
}