#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, q;
int a[N][10];
struct node {
  int nxt[10];
  long long sum[10];
} tree[N << 3];
void up(int rt) {
  for (int i = 0; i < 10; i++)
    tree[rt].sum[i] = tree[(rt << 1)].sum[i] + tree[(rt << 1 | 1)].sum[i];
}
long long sum1[10], sum2[10];
void down(int rt) {
  for (int i = 0; i < 10; i++) sum1[i] = 0, sum2[i] = 0;
  for (int i = 0; i < 10; i++)
    tree[(rt << 1)].nxt[i] = tree[rt].nxt[tree[(rt << 1)].nxt[i]],
                tree[(rt << 1 | 1)].nxt[i] =
                    tree[rt].nxt[tree[(rt << 1 | 1)].nxt[i]];
  for (int i = 0; i < 10; i++)
    sum1[tree[rt].nxt[i]] += tree[(rt << 1)].sum[i],
        sum2[tree[rt].nxt[i]] += tree[(rt << 1 | 1)].sum[i];
  for (int i = 0; i < 10; i++)
    tree[(rt << 1)].sum[i] = sum1[i], tree[(rt << 1 | 1)].sum[i] = sum2[i];
  for (int i = 0; i < 10; i++) tree[rt].nxt[i] = i;
}
void build(int l, int r, int rt) {
  for (int i = 0; i < 10; i++) tree[rt].nxt[i] = i;
  if (l == r) {
    for (int i = 0; i < 10; i++) tree[rt].sum[i] = a[l][i];
    return;
  }
  int mid = l + r >> 1;
  build(l, mid, (rt << 1));
  build(mid + 1, r, (rt << 1 | 1));
  up(rt);
}
void update(int L, int R, int l, int r, int rt, int x, int y) {
  if (L <= l && r <= R) {
    for (int i = 0; i < 10; i++)
      if (tree[rt].nxt[i] == x) tree[rt].nxt[i] = y;
    tree[rt].sum[y] += tree[rt].sum[x];
    tree[rt].sum[x] = 0;
    return;
  }
  down(rt);
  int mid = l + r >> 1;
  if (L <= mid) update(L, R, l, mid, (rt << 1), x, y);
  if (R > mid) update(L, R, mid + 1, r, (rt << 1 | 1), x, y);
  up(rt);
  return;
}
long long query(int L, int R, int l, int r, int rt) {
  if (L <= l && r <= R) {
    long long tmp = 0;
    for (int i = 0; i < 10; i++) tmp += i * tree[rt].sum[i];
    return tmp;
  }
  down(rt);
  int mid = l + r >> 1;
  long long tmp = 0;
  if (L <= mid) tmp += query(L, R, l, mid, (rt << 1));
  if (R > mid) tmp += query(L, R, mid + 1, r, (rt << 1 | 1));
  up(rt);
  return tmp;
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    int base = 1;
    while (x) {
      a[i][x % 10] += base;
      x /= 10;
      base *= 10;
    }
  }
  build(1, n, 1);
  while (q--) {
    int type, l, r, x, y;
    scanf("%d", &type);
    if (type == 1) {
      scanf("%d%d%d%d", &l, &r, &x, &y);
      if (x == y) continue;
      update(l, r, 1, n, 1, x, y);
    } else {
      scanf("%d%d", &l, &r);
      printf("%I64d\n", query(l, r, 1, n, 1));
    }
  }
  return 0;
}
