#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
int a[N], n, q;
long long sum[N << 2][11], mul[11] = {1};
long long SUM[11], LA[11];
int lazy[N << 2][11];
void pushup(int rt) {
  for (int i = 0; i < 10; ++i) {
    sum[rt][i] = sum[rt << 1][i] + sum[rt << 1 | 1][i];
  }
}
void pushdown(int rt) {
  for (int i = 0; i < 10; ++i)
    SUM[i] = sum[rt << 1][i], LA[i] = lazy[rt << 1][i];
  for (int i = 0; i < 10; ++i) {
    int u = i, v = lazy[rt][i];
    if (u == v) continue;
    for (int j = 0; j < 10; ++j) {
      if (lazy[rt << 1][j] == u) {
        LA[j] = lazy[rt][i];
      }
    }
    SUM[lazy[rt][i]] += sum[rt << 1][i];
    SUM[i] -= sum[rt << 1][i];
  }
  for (int i = 0; i < 10; ++i)
    sum[rt << 1][i] = SUM[i], lazy[rt << 1][i] = LA[i];
  for (int i = 0; i < 10; ++i)
    SUM[i] = sum[rt << 1 | 1][i], LA[i] = lazy[rt << 1 | 1][i];
  for (int i = 0; i < 10; ++i) {
    int u = i, v = lazy[rt][i];
    if (u == v) continue;
    for (int j = 0; j < 10; ++j) {
      if (lazy[rt << 1 | 1][j] == u) {
        LA[j] = lazy[rt][i];
      }
    }
    SUM[lazy[rt][i]] += sum[rt << 1 | 1][i];
    SUM[i] -= sum[rt << 1 | 1][i];
  }
  for (int i = 0; i < 10; ++i)
    sum[rt << 1 | 1][i] = SUM[i], lazy[rt << 1 | 1][i] = LA[i];
  for (int i = 0; i < 10; ++i) lazy[rt][i] = i;
}
void build(int l, int r, int rt) {
  for (int i = 0; i < 10; ++i) lazy[rt][i] = i;
  if (l == r) {
    int x = a[l], index = 0;
    while (x) {
      int y = x % 10;
      x /= 10;
      sum[rt][y] += mul[index];
      index++;
    }
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, rt << 1);
  build(mid + 1, r, rt << 1 | 1);
  pushup(rt);
}
void update(int l, int r, int rt, int L, int R, int x, int y) {
  if (L <= l && r <= R) {
    for (int j = 0; j < 10; ++j) {
      if (lazy[rt][j] == x) {
        lazy[rt][j] = y;
        sum[rt][y] += sum[rt][x];
        sum[rt][x] = 0;
      }
    }
    return;
  }
  pushdown(rt);
  int mid = (l + r) >> 1;
  if (L <= mid) update(l, mid, rt << 1, L, R, x, y);
  if (R > mid) update(mid + 1, r, rt << 1 | 1, L, R, x, y);
  pushup(rt);
}
long long query(int l, int r, int rt, int L, int R) {
  if (L <= l && r <= R) {
    long long ret = 0;
    for (int i = 0; i < 10; ++i) ret += sum[rt][i] * i;
    return ret;
  }
  pushdown(rt);
  int mid = (l + r) >> 1;
  long long ret = 0;
  if (L <= mid) ret += query(l, mid, rt << 1, L, R);
  if (R > mid) ret += query(mid + 1, r, rt << 1 | 1, L, R);
  return ret;
}
int main() {
  for (int i = 1; i < 11; ++i) mul[i] = mul[i - 1] * 10;
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
  }
  build(1, n, 1);
  while (q--) {
    int op, L, R, x, y;
    scanf("%d", &op);
    if (op == 1) {
      scanf("%d%d%d%d", &L, &R, &x, &y);
      if (x == y) continue;
      update(1, n, 1, L, R, x, y);
    } else {
      scanf("%d%d", &L, &R);
      printf("%lld\n", query(1, n, 1, L, R));
    }
  }
  return 0;
}
