#include <bits/stdc++.h>
using namespace std;
long long int input[400007];
long long int segTree[400007][10];
long long int lazy[400007][10];
void constructTree(long long int l, long long int r, long long int pos) {
  for (long long int i = 0; i < 10; i++) {
    segTree[pos][i] = 0;
    lazy[pos][i] = i;
  }
  if (l == r) {
    long long int x = input[l];
    long long int p = 1;
    while (x > 0) {
      long long int r = x % 10;
      segTree[pos][r] += p;
      p *= 10;
      x /= 10;
    }
    return;
  }
  long long int mid = (l + r) / 2;
  constructTree(l, mid, pos * 2);
  constructTree(mid + 1, r, pos * 2 + 1);
  for (long long int i = 0; i < 10; i++)
    segTree[pos][i] = segTree[pos * 2][i] + segTree[pos * 2 + 1][i];
}
void updateLazy(long long int *l1, long long int *l2) {
  for (long long int i = 0; i < 10; i++) l2[i] = l1[l2[i]];
}
long long int sumarr[10];
void Update(long long int ql, long long int qr, long long int od,
            long long int nd, long long int l, long long int r,
            long long int pos) {
  bool zero = true;
  for (long long int i = 0; i < 10; i++)
    if (lazy[pos][i] != i) zero = false;
  if (!zero) {
    memset(sumarr, 0, sizeof(sumarr));
    for (long long int i = 0; i < 10; i++) {
      long long int nod = i;
      long long int nnd = lazy[pos][i];
      sumarr[nnd] += segTree[pos][nod];
    }
    for (long long int i = 0; i < 10; i++) segTree[pos][i] = sumarr[i];
    if (l != r) {
      updateLazy(lazy[pos], lazy[2 * pos]);
      updateLazy(lazy[pos], lazy[2 * pos + 1]);
    }
    for (long long int i = 0; i < 10; i++) lazy[pos][i] = i;
  }
  if (l > qr || r < ql) return;
  if (l >= ql && r <= qr) {
    if (l != r) {
      long long int newLazy[10];
      for (long long int i = 0; i < 10; i++) newLazy[i] = i;
      newLazy[od] = nd;
      updateLazy(newLazy, lazy[2 * pos]);
      updateLazy(newLazy, lazy[2 * pos + 1]);
    }
    segTree[pos][nd] += segTree[pos][od];
    segTree[pos][od] = 0;
    return;
  }
  long long int mid = (l + r) / 2;
  Update(ql, qr, od, nd, l, mid, pos * 2);
  Update(ql, qr, od, nd, mid + 1, r, pos * 2 + 1);
  for (long long int i = 0; i < 10; i++)
    segTree[pos][i] = segTree[2 * pos][i] + segTree[2 * pos + 1][i];
}
long long int query(long long int ql, long long int qr, long long int l,
                    long long int r, long long int pos) {
  bool zero = true;
  for (long long int i = 0; i < 10; i++)
    if (lazy[pos][i] != i) zero = false;
  if (!zero) {
    memset(sumarr, 0, sizeof(sumarr));
    for (long long int i = 0; i < 10; i++) {
      long long int nod = i;
      long long int nnd = lazy[pos][i];
      sumarr[nnd] += segTree[pos][nod];
    }
    for (long long int i = 0; i < 10; i++) segTree[pos][i] = sumarr[i];
    if (l != r) {
      updateLazy(lazy[pos], lazy[2 * pos]);
      updateLazy(lazy[pos], lazy[2 * pos + 1]);
    }
    for (long long int i = 0; i < 10; i++) lazy[pos][i] = i;
  }
  if (l > qr || r < ql) return 0;
  if (l >= ql && r <= qr) {
    long long int ans = 0;
    for (long long int i = 0; i < 10; i++) ans += (i * segTree[pos][i]);
    return ans;
  }
  long long int mid = (l + r) / 2;
  return query(ql, qr, l, mid, pos * 2) +
         query(ql, qr, mid + 1, r, pos * 2 + 1);
}
int main() {
  ios_base::sync_with_stdio(false);
  long long int n, q;
  cin >> n >> q;
  long long int a[n + 5];
  for (long long int i = 1; i <= n; i++) {
    cin >> a[i];
    input[i] = a[i];
  }
  constructTree(1, n, 1);
  while (q-- > 0) {
    long long int t, l, r, x, y;
    cin >> t >> l >> r;
    if (t == 1) cin >> x >> y;
    if (t == 2)
      cout << query(l, r, 1, n, 1) << endl;
    else {
      if (x == y) continue;
      Update(l, r, x, y, 1, n, 1);
    }
  }
  return 0;
}
