#include <bits/stdc++.h>
using namespace std;
bool home = 1;
signed realMain();
signed main() {
  home = 0;
  if (home) {
    freopen("input", "r", stdin);
  } else {
    ios::sync_with_stdio(0);
    cin.tie(0);
  }
  realMain();
}
const long long N = (long long)1e5 + 7;
long long n, q, a[N];
long long sum[4 * N][10];
long long to[4 * N][10];
void join(long long v) {
  for (long long d = 0; d < 10; d++) {
    sum[v][d] = sum[2 * v][d] + sum[2 * v + 1][d];
  }
}
void build(long long v, long long tl, long long tr) {
  for (long long j = 0; j < 10; j++) {
    to[v][j] = j;
  }
  if (tl == tr) {
    vector<long long> digits;
    long long num = a[tl];
    while (num) {
      digits.push_back(num % 10);
      num /= 10;
    }
    long long coef = 1;
    for (auto &d : digits) {
      sum[v][d] += coef;
      coef *= 10;
    }
  } else {
    long long tm = (tl + tr) / 2;
    build(2 * v, tl, tm);
    build(2 * v + 1, tm + 1, tr);
    join(v);
  }
}
long long ff[10];
long long ss[10];
long long sm[10];
void push(long long v, long long tl, long long tr) {
  if (tl < tr) {
    for (long long j = 0; j < 10; j++) {
      ff[j] = to[v][to[2 * v][j]];
      ss[j] = to[v][to[2 * v + 1][j]];
    }
    for (long long j = 0; j < 10; j++) {
      to[2 * v][j] = ff[j];
      to[2 * v + 1][j] = ss[j];
    }
  }
  for (long long j = 0; j < 10; j++) {
    sm[to[v][j]] += sum[v][j];
  }
  for (long long j = 0; j < 10; j++) {
    to[v][j] = j;
    sum[v][j] = sm[j];
    sm[j] = 0;
  }
}
void op(long long v, long long tl, long long tr, long long l, long long r,
        long long x, long long y) {
  push(v, tl, tr);
  if (tr < l || r < tl) return;
  if (l <= tl && tr <= r) {
    to[v][x] = y;
    push(v, tl, tr);
    return;
  }
  long long tm = (tl + tr) / 2;
  op(2 * v, tl, tm, l, r, x, y);
  op(2 * v + 1, tm + 1, tr, l, r, x, y);
  join(v);
}
long long get(long long v, long long tl, long long tr, long long l,
              long long r) {
  push(v, tl, tr);
  if (tr < l || r < tl) return 0;
  if (l <= tl && tr <= r) {
    long long ret = 0;
    for (long long d = 0; d < 10; d++) {
      ret += sum[v][d] * d;
    }
    return ret;
  }
  long long tm = (tl + tr) / 2;
  return get(2 * v, tl, tm, l, r) + get(2 * v + 1, tm + 1, tr, l, r);
}
void op(long long l, long long r, long long x, long long y) {
  if (x == y) return;
  op(1, 1, n, l, r, x, y);
}
long long get(long long l, long long r) { return get(1, 1, n, l, r); }
signed realMain() {
  cin >> n >> q;
  for (long long i = 1; i <= n; i++) {
    cin >> a[i];
  }
  build(1, 1, n);
  while (q--) {
    long long type;
    cin >> type;
    if (type == 1) {
      long long l, r, x, y;
      cin >> l >> r >> x >> y;
      op(l, r, x, y);
    } else {
      long long l, r;
      cin >> l >> r;
      cout << get(l, r) << "\n";
    }
  }
  return 0;
}
