#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int MAX = 1e5 + 10;
const long long mod = 1e9 + 7;
struct node {
  long long l, r, mid, sum, tag;
  node() {}
  node(long long a, long long b) {
    l = a;
    r = b;
    sum = 0;
    tag = 0;
    mid = (l + r) >> 1;
  }
} tree[4 * MAX][15];
long long c[MAX][15];
void change(long long id, long long son) {
  long long i, j, s[12], tag[12];
  memset((s), (0), sizeof(s));
  for (i = 0; i <= 9; i++) {
    tag[i] = tree[son][i].tag;
    s[i] = tree[son][i].sum;
  }
  for (i = 0; i <= 9; i++) {
    if (tree[id][i].tag != i) {
      for (j = 0; j <= 9; j++) {
        if (tree[son][j].tag == i) tag[j] = tree[id][i].tag;
      }
      s[tree[id][i].tag] += tree[son][i].sum;
      s[i] -= tree[son][i].sum;
    }
  }
  for (i = 0; i <= 9; i++) {
    tree[son][i].tag = tag[i];
    tree[son][i].sum = s[i];
  }
}
void pushdown(long long id) {
  long long i;
  change(id, id << 1);
  change(id, id << 1 | 1);
  for (i = 0; i <= 9; i++) {
    tree[id][i].tag = i;
  }
}
void pushup(long long id) {
  long long i;
  for (i = 0; i <= 9; i++) {
    tree[id][i].sum = tree[id << 1][i].sum + tree[id << 1 | 1][i].sum;
  }
}
void build(long long l, long long r, long long id) {
  long long mid, i;
  for (i = 0; i <= 9; i++) {
    tree[id][i] = node(l, r);
    tree[id][i].tag = i;
    if (l == r) tree[id][i].sum = c[l][i];
  }
  if (l == r) return;
  mid = (l + r) >> 1;
  build(l, mid, id << 1);
  build(mid + 1, r, id << 1 | 1);
  pushup(id);
}
void update(long long l, long long r, long long id, long long x, long long y) {
  long long mid, i, s = 0;
  if (l <= tree[id][x].l && r >= tree[id][x].r) {
    for (i = 0; i <= 9; i++) {
      if (tree[id][i].tag == x) {
        tree[id][i].tag = y;
      }
    }
    tree[id][y].sum += tree[id][x].sum;
    tree[id][x].sum = 0;
    return;
  }
  pushdown(id);
  mid = tree[id][x].mid;
  if (r <= mid)
    update(l, r, id << 1, x, y);
  else if (l >= mid + 1)
    update(l, r, id << 1 | 1, x, y);
  else {
    update(l, mid, id << 1, x, y);
    update(mid + 1, r, id << 1 | 1, x, y);
  }
  pushup(id);
}
long long query(long long l, long long r, long long id, long long x) {
  long long mid, s = 0, i;
  if (l == tree[id][x].l && r == tree[id][x].r) {
    for (i = 0; i <= 9; i++) {
      s += tree[id][i].sum * i;
    }
    return s;
  }
  pushdown(id);
  mid = tree[id][x].mid;
  if (r <= mid)
    return query(l, r, id << 1, x);
  else if (l >= mid + 1)
    return query(l, r, id << 1 | 1, x);
  else
    return query(l, mid, id << 1, x) + query(mid + 1, r, id << 1 | 1, x);
  pushup(id);
}
int main() {
  long long i, n, q, x, op, l, r, a, b, temp;
  while (~scanf("%lld%lld", &n, &q)) {
    memset((c), (0), sizeof(c));
    for (i = 1; i <= n; i++) {
      scanf("%lld", &x);
      temp = 1;
      while (x) {
        long long now = x % 10;
        c[i][now] += temp;
        x /= 10;
        temp *= 10;
      }
    }
    build(1, n, 1);
    while (q--) {
      scanf("%lld%lld%lld", &op, &l, &r);
      if (op == 1) {
        scanf("%lld%lld", &a, &b);
        if (a != b) update(l, r, 1, a, b);
      } else {
        long long ans = 0;
        ans = query(l, r, 1, 1);
        printf("%lld\n", ans);
      }
    }
  }
  return 0;
}
