#include<bits/extc++.h> #include<bits/stdc++.h> constexprint N = 1e5 + 10; constexprint V = 1e4 + 10; constexprint B = 400;
std::vector<int> P; int ck[V]; int n, m; int a[N]; int L[B], R[B], belong[N], bsize, bnum; int map[B][V], tag[B];
voidinit_ck(){ for (int b = 1; b <= 4; b++) { for (int i = 0; i < (1 << b); i++) { int t = 0; for (int j = 0; j < b; j++) { if (i & (1 << j)) t = t * 10 + 4; else t = t * 10 + 7; } if (t < V) { ck[t] = 1; P.push_back(t); } } } } intcheck(int x){ return ck[x]; }
voidrebuild(int l, int r, int v){ int id = belong[l]; if (tag[id] == 0) { if (v == 0) return; for (int i = l; i <= r; i++) { map[id][a[i]]--; a[i] += v; map[id][a[i]]++; } } else { for (int i = L[id]; i <= R[id]; i++) { map[id][a[i]]--; a[i] += tag[id]; if (l <= i && i <= r) a[i] += v; map[id][a[i]]++; } tag[id] = 0; } }
voidadd(int l, int r, int v){ int s = belong[l], e = belong[r]; if (s == e) rebuild(l, r, v); else { rebuild(l, R[s], v); rebuild(L[e], r, v); for (int i = s + 1; i < e; i++) tag[i] += v; } }
intquery(int l, int r){ int s = belong[l], e = belong[r]; int ans = 0; if (s == e) { rebuild(l, r, 0); for (int i = l; i <= r; i++) ans += ck[a[i]]; } else { rebuild(l, R[s], 0); rebuild(L[e], r, 0); for (int i = l; i <= R[s]; i++) ans += ck[a[i]]; for (int i = L[e]; i <= r; i++) ans += ck[a[i]]; for (int i = s + 1; i < e; i++) { for (int p : P) if (p >= tag[i]) ans += map[i][p - tag[i]]; } } return ans; }
#include<bits/stdc++.h> using ll = longlong; constexprint N = 1e5 + 10; constexprint B = 505; constexprint M = 10007;
structtag { ll add{0}, mul{1}; // x * mul + add
boolis_null(){ return add == 0 && mul == 1; } voidclear(){ add = 0, mul = 1; } voidapply_mul(ll v){ (mul *= v) %= M, (add *= v) %= M; } voidapply_add(ll v){ (add += v) %= M; } voidmerge(tag T){ assert(T.add == 0or T.mul == 1);
if (T.add != 0) apply_add(T.add); else apply_mul(T.mul); } };
structblock { tag t; int l, r; };
int n, opt, l, r, c; int sqrtn, blkcnt; std::array<int, N> bel; std::array<ll, N> a; std::array<block, B> blks;
voidrebuild(int L, int R, tag v){ int b = bel[L]; for (int i = blks[b].l; i <= blks[b].r; i++) { a[i] = (a[i] * blks[b].t.mul % M + blks[b].t.add) % M;
if (L <= i && i <= R) { if (v.add != 0) (a[i] += v.add) %= M; else (a[i] *= v.mul) %= M; } } blks[b].t.clear(); }
voidapply(int L, int R, tag T){ int s = bel[L], e = bel[R]; if (s == e) rebuild(L, R, T); else { rebuild(L, blks[s].r, T); rebuild(blks[e].l, R, T); for (int i = s + 1; i <= e - 1; i++) blks[i].t.merge(T); } }
voidquery(int pos){ int b = bel[pos]; std::cout << (a[pos] * blks[b].t.mul % M + blks[b].t.add) % M << "\n"; }
intmain(){ std::cin >> n; for (int i = 1; i <= n; i++) std::cin >> a[i], a[i] %= M;
sqrtn = std::sqrt(n), blkcnt = (n + sqrtn - 1) / sqrtn; for (int i = 1; i <= blkcnt; i++) { l = (i - 1) * sqrtn + 1, r = std::min(i * sqrtn, n); blks[i].l = l, blks[i].r = r; for (int j = l; j <= r; j++) bel[j] = i; }
for (int i = 1; i <= n; i++) { std::cin >> opt >> l >> r >> c;