#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
const long long INF = 0x3f3f3f3f3f3f3f3f;
const long long llinf = (1LL << 62);
const int inf = (1 << 30);
const int nmax = 1e5 + 50;
const long long mod = 1e9 + 7;
using namespace std;
int n, i, q, a[nmax], tp, l, r, x, y, nx[4 * nmax][10];
long long st[4 * nmax][10], sum[10];
void build(int x, int l, int r) {
  for (int i = 0; i < 10; i++) nx[x][i] = i;
  if (l == r) {
    int v = a[l];
    long long pw = 1;
    while (v) {
      st[x][v % 10] += pw;
      pw *= 10;
      v /= 10;
    }
    return;
  }
  int mid = (l + r) / 2;
  build(2 * x, l, mid);
  build(2 * x + 1, mid + 1, r);
  for (int i = 0; i < 10; i++) st[x][i] = st[2 * x][i] + st[2 * x + 1][i];
}
void push(int nod, int l, int r) {
  for (int i = 0; i < 10; i++) sum[i] = 0;
  for (int i = 0; i < 10; i++) {
    sum[nx[nod][i]] += st[nod][i];
    if (l != r) {
      nx[2 * nod][i] = nx[nod][nx[2 * nod][i]];
      nx[2 * nod + 1][i] = nx[nod][nx[2 * nod + 1][i]];
    }
  }
  for (int i = 0; i < 10; i++) {
    st[nod][i] = sum[i];
    nx[nod][i] = i;
  }
}
void upd(int nod, int l, int r, int tl, int tr, int x, int y) {
  push(nod, l, r);
  if (tl <= l && r <= tr) {
    nx[nod][x] = y;
    push(nod, l, r);
    return;
  }
  int mid = (l + r) / 2;
  if (tl <= mid) upd(nod * 2, l, mid, tl, tr, x, y);
  if (mid < tr) upd(nod * 2 + 1, mid + 1, r, tl, tr, x, y);
  push(nod * 2, l, mid);
  push(nod * 2 + 1, mid + 1, r);
  for (int i = 0; i < 10; i++) st[nod][i] = st[2 * nod][i] + st[2 * nod + 1][i];
}
long long qry(int nod, int l, int r, int tl, int tr) {
  push(nod, l, r);
  if (tl > r || l > tr) return 0;
  if (tl <= l && r <= tr) {
    long long sm = 0;
    for (int i = 0; i < 10; i++) sm += st[nod][i] * 1LL * i;
    return sm;
  }
  int mid = (l + r) / 2;
  return qry(2 * nod, l, mid, tl, tr) + qry(2 * nod + 1, mid + 1, r, tl, tr);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cerr.tie(0);
  cout.tie(0);
  cin >> n >> q;
  for (i = 1; i <= n; i++) cin >> a[i];
  build(1, 1, n);
  while (q--) {
    cin >> tp >> l >> r;
    if (tp == 1) {
      cin >> x >> y;
      if (x != y) upd(1, 1, n, l, r, x, y);
    } else
      cout << qry(1, 1, n, l, r) << '\n';
  }
  return 0;
}
