#include <bits/stdc++.h>
using namespace std;
const long long N = 1e5 + 5, Mod = 1e9 + 7, Lg = 27, P = 727, Sq = 320;
const long long Inf = 3e18 + 10;
long long Lz[4 * N][10], S[4 * N][10], A[N], Pw[N], Nx[10], n, m;
inline void Shift(long long s, long long e, long long ind) {
  for (long long i = (2 * (ind)); i <= ((2 * (ind)) + 1); i++) {
    for (long long j = 0; j < 10; j++) Nx[j] = 0;
    for (long long j = 0; j < 10; j++) {
      Lz[i][j] = Lz[ind][Lz[i][j]];
      Nx[Lz[ind][j]] += S[i][j];
    }
    for (long long j = 0; j < 10; j++) S[i][j] = Nx[j];
  }
  for (long long i = 0; i < 10; i++) Lz[ind][i] = i;
}
void Build(long long s, long long e, long long ind) {
  for (long long i = 0; i < 10; i++) Lz[ind][i] = i;
  if (e - s == 1) {
    long long p = 0, now = A[s];
    while (now) {
      S[ind][now % 10] = (S[ind][now % 10] + Pw[p]);
      now /= 10, p++;
    }
    return;
  }
  long long mid = (s + e) / 2;
  Build(s, mid, (2 * (ind))), Build(mid, e, ((2 * (ind)) + 1));
  for (long long i = 0; i < 10; i++)
    S[ind][i] = (S[(2 * (ind))][i] + S[((2 * (ind)) + 1)][i]);
}
void Fix(long long s, long long e, long long ind, long long l, long long r,
         long long x, long long y) {
  if (s >= l && e <= r) {
    S[ind][y] = (S[ind][y] + S[ind][x]);
    S[ind][x] = 0;
    for (long long i = 0; i < 10; i++)
      if (Lz[ind][i] == x) Lz[ind][i] = y;
    return;
  }
  Shift(s, e, ind);
  long long mid = (s + e) / 2;
  if (l < mid) Fix(s, mid, (2 * (ind)), l, r, x, y);
  if (r > mid) Fix(mid, e, ((2 * (ind)) + 1), l, r, x, y);
  for (long long i = 0; i < 10; i++)
    S[ind][i] = (S[(2 * (ind))][i] + S[((2 * (ind)) + 1)][i]);
}
long long Query(long long s, long long e, long long ind, long long l,
                long long r) {
  if (s >= l && e <= r) {
    long long ret = 0;
    for (long long i = 0; i < 10; i++) ret = (ret + S[ind][i] * i);
    return ret;
  }
  Shift(s, e, ind);
  long long mid = (s + e) / 2, ret = 0;
  if (l < mid) ret = (ret + Query(s, mid, (2 * (ind)), l, r));
  if (r > mid) ret = (ret + Query(mid, e, ((2 * (ind)) + 1), l, r));
  return ret;
}
int32_t main() {
  Pw[0] = 1;
  for (long long i = 1; i < 19; i++) Pw[i] = (1ll * Pw[i - 1] * 10);
  scanf("%lld%lld", &n, &m);
  for (long long i = 1; i <= n; i++) scanf("%lld", &A[i]);
  Build(1, n + 1, 1);
  for (long long i = 1; i <= m; i++) {
    long long t, l, r, x, y;
    scanf("%lld%lld%lld", &t, &l, &r);
    if (t ^ 2) {
      scanf("%lld%lld", &x, &y);
      if (x == y) continue;
      Fix(1, n + 1, 1, l, r + 1, x, y);
    }
    if (t ^ 1) {
      printf("%lld\n", Query(1, n + 1, 1, l, r + 1));
    }
  }
  return 0;
}
