#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int dist[10001];
int n, Q;
int a[MAXN];
bool vis[10001];
struct node {
  int l, r, sum, near, flag, v;
} t[MAXN << 2];
void dfs(int x) {
  if (x <= 10000)
    vis[x] = true;
  else
    return;
  dfs(x * 10 + 4);
  dfs(x * 10 + 7);
}
void push_down(int k) {
  t[k << 1].flag += t[k].flag;
  t[k << 1 | 1].flag += t[k].flag;
  if (t[k].flag) {
    t[k].near -= t[k].flag;
    t[k].flag = 0;
  }
  if (t[k].sum == 0) t[k << 1].sum = t[k << 1 | 1].sum = 0;
}
void push_up(int k) {
  t[k].near = min(t[k << 1].near - t[k << 1].flag,
                  t[k << 1 | 1].near - t[k << 1 | 1].flag);
  t[k].sum = t[k << 1].sum + t[k << 1 | 1].sum;
}
void build(int l, int r, int k) {
  t[k].l = l;
  t[k].r = r;
  t[k].flag = 0;
  if (l == r) {
    t[k].near = dist[a[l]];
    t[k].v = a[l];
    t[k].sum = (vis[a[l]]);
    return;
  }
  int mid = l + r >> 1;
  build(l, mid, k << 1);
  build(mid + 1, r, k << 1 | 1);
  push_up(k);
}
int query(int l, int r, int k) {
  if (l <= t[k].l && t[k].r <= r) return t[k].sum;
  if (t[k].l != t[k].r) push_down(k);
  int ans = 0;
  int mid = t[k].l + t[k].r >> 1;
  if (l <= mid) ans += query(l, r, k << 1);
  if (r > mid) ans += query(l, r, k << 1 | 1);
  return ans;
}
void update(int l, int r, int val, int k) {
  if (t[k].l != t[k].r) push_down(k);
  if (l <= t[k].l && t[k].r <= r) {
    if (t[k].l == t[k].r) {
      t[k].v += t[k].flag + val;
      t[k].flag = 0;
      t[k].sum = (vis[t[k].v]);
      t[k].near = dist[t[k].v];
      return;
    }
    if (t[k].near > t[k].flag + val) {
      t[k].flag += val;
      t[k].sum = 0;
      return;
    }
  }
  int mid = t[k].l + t[k].r >> 1;
  if (l <= mid) update(l, r, val, k << 1);
  if (r > mid) update(l, r, val, k << 1 | 1);
  push_up(k);
}
int main() {
  dfs(0);
  for (int i = 10000; i >= 1; i--) dist[i] = 0x3F3F3F3F;
  for (int i = 9999; i >= 1; i--) {
    if (vis[i + 1])
      dist[i] = 1;
    else
      dist[i] = dist[i + 1] + 1;
  }
  scanf("%d%d", &n, &Q);
  for (int i = 1; i <= n; i++) scanf("%d", a + i);
  build(1, n, 1);
  char op[10];
  int a, b, c;
  while (Q--) {
    scanf("%s%d%d", op, &a, &b);
    if (op[0] == 'c') {
      printf("%d\n", query(a, b, 1));
    } else {
      scanf("%d", &c);
      update(a, b, c, 1);
    }
  }
  return 0;
}
