#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; }