#include <bits/stdc++.h>
using namespace std;
void ga(int N, int *A) {
  for (int i(0); i < N; i++) scanf("%d", A + i);
}
char P[(1 << 17) * 2][10];
int p[9][(1 << 17) * 2][10], I, z[10], F[20][10];
bitset<(1 << 17) * 2> C;
struct sX {
  int N;
  void ini(int n) {
    N = 1 << (int(log2(n) - (1e-10)) + 1), (memset(p, 0, sizeof(p)));
    if (!I)
      for (int i(0); i < N << 1; i++) iota(P[i], P[i] + 10, 0);
  }
  void nm(int b, int v) { nm(b, v, 1, 0, N - 1); }
  void nm(int b, int v, int u, int B, int E) {
    if (B > b || E < b) return;
    if (E == B) {
      ++p[I][u][v];
      return;
    }
    nm(b, v, u << 1, B, (B + E) >> 1), nm(b, v, u << 1 | 1, (B + E) / 2 + 1, E);
    ++p[I][u][v];
  }
  void ap(int u, char *w) {
    if (!I) {
      if (C[u])
        for (int i(0); i < 10; i++) P[u][i] = w[(int)P[u][i]];
      else
        memcpy(P[u], w, sizeof(P[u]));
    }
    C[u] = 1;
  }
  void st(int b, int e, int f, int t) { st(b, e, f, t, 1, 0, N - 1); }
  void AD(int u, int *f) {
    for (int i(0); i < 10; i++) f[(int)P[u][i]] += p[I][u][i];
  }
  void st(int b, int e, int f, int t, int u, int B, int E) {
    if (B > e || E < b) return;
    if (b <= B && e >= E) {
      if (I) return;
      if (C[u]) {
        for (int i(0); i < 10; i++)
          if (P[u][i] == f) P[u][i] = t;
      } else
        P[u][f] = t, C[u] = 1;
      return;
    }
    if (C[u])
      ap(u << 1, P[u]), ap(u << 1 | 1, P[u]), iota(P[u], P[u] + 10, 0),
          C[u] = 0;
    st(b, e, f, t, u << 1, B, (B + E) >> 1),
        st(b, e, f, t, u << 1 | 1, (B + E) / 2 + 1, E);
    (memset(p[I][u], 0, sizeof(p[I][u]))), AD(u << 1, p[I][u]),
        AD(u << 1 | 1, p[I][u]);
  }
  void gt(int b, int e, int *f) { gt(b, e, f, 1, 0, N - 1, 0); }
  void gt(int b, int e, int *f, int u, int B, int E, int d) {
    if (B > e || E < b) return;
    if (b <= B && e >= E) return AD(u, f);
    if (!C[u] && b > (B + E) >> 1)
      return gt(b, e, f, u << 1 | 1, (B + E) / 2 + 1, E, d + 1);
    if (!C[u] && e <= (B + E) >> 1)
      return gt(b, e, f, u << 1, B, (B + E) >> 1, d + 1);
    (memset(F[d], 0, sizeof(F[d])));
    gt(b, e, F[d], u << 1, B, (B + E) >> 1, d + 1),
        gt(b, e, F[d], u << 1 | 1, (B + E) / 2 + 1, E, d + 1);
    for (int i(0); i < 10; i++) f[(int)P[u][i]] += F[d][i];
  }
} T[9];
char s[32];
int N, Q, L, a, b, c, d, e, f, H[10];
long long S, t;
int main(void) {
  scanf("%d%d", &N, &Q);
  for (int i(0); i < 9; i++) I = i, T[i].ini(N);
  for (int i(0); i < N; i++) {
    scanf("%s", s), L = strlen(s);
    for (int j(0); j < L; j++) I = L - j - 1, T[L - j - 1].nm(i, s[j] - 48);
  }
  for (int i(0); i < Q; i++) {
    scanf("%d%d%d", &a, &b, &c), --b, --c;
    if (a == 1) {
      scanf("%d%d", &d, &e);
      if (d == e) continue;
      for (int i(0); i < 9; i++) I = i, T[i].st(b, c, d, e);
    } else {
      S = 0, t = 1;
      for (int i(0); i < 9; i++) {
        I = i, (memset(H, 0, sizeof(H))), T[i].gt(b, c, H);
        for (int j(0); j < 10; j++) S += H[j] * t * j;
        t *= 10;
      }
      printf("%lld\n", S);
    }
  }
  return 0;
}
