#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const int N = 100005;
long long a[10];
int v[N][10], n, m, x, y, l, r, opt;
struct Tree {
  int l, r, flag[10];
  long long num[10];
} T[N * 4];
inline void build(int x, int l, int r) {
  T[x].l = l;
  T[x].r = r;
  for (int i = 0; i < 10; i++) T[x].flag[i] = i;
  if (l == r) {
    for (int i = 0; i < 10; i++) T[x].num[i] = v[l][i];
    return;
  }
  int mid = (l + r) / 2;
  build(x * 2, l, mid);
  build(x * 2 + 1, mid + 1, r);
  for (int i = 0; i < 10; i++)
    T[x].num[i] = T[x * 2].num[i] + T[x * 2 + 1].num[i];
}
inline void down(int x) {
  memset(a, 0, sizeof a);
  for (int i = 0; i < 10; i++) a[T[x].flag[i]] += T[x * 2].num[i];
  for (int i = 0; i < 10; i++)
    T[x * 2].num[i] = a[i], T[x * 2].flag[i] = T[x].flag[T[x * 2].flag[i]];
  memset(a, 0, sizeof a);
  for (int i = 0; i < 10; i++) a[T[x].flag[i]] += T[x * 2 + 1].num[i];
  for (int i = 0; i < 10; i++)
    T[x * 2 + 1].num[i] = a[i],
              T[x * 2 + 1].flag[i] = T[x].flag[T[x * 2 + 1].flag[i]];
  for (int i = 0; i < 10; i++) T[x].flag[i] = i;
}
inline void insert(int x, int l, int r, int A, int B) {
  if (T[x].l > r || l > T[x].r) return;
  if (T[x].l >= l && T[x].r <= r) {
    memset(a, 0, sizeof a);
    for (int i = 0; i < 10; i++)
      if (T[x].flag[i] == A) T[x].flag[i] = B;
    for (int i = 0; i < 10; i++)
      if (i == A)
        a[B] += T[x].num[i];
      else
        a[i] += T[x].num[i];
    for (int i = 0; i < 10; i++) T[x].num[i] = a[i];
    return;
  }
  down(x);
  insert(x * 2, l, r, A, B);
  insert(x * 2 + 1, l, r, A, B);
  for (int i = 0; i < 10; i++)
    T[x].num[i] = T[x * 2].num[i] + T[x * 2 + 1].num[i];
}
inline long long find(int x, int l, int r) {
  if (T[x].l > r || l > T[x].r) return 0;
  if (T[x].l >= l && T[x].r <= r) {
    long long s = 0;
    for (int i = 0; i < 10; i++) s += T[x].num[i] * i;
    return s;
  }
  down(x);
  return find(x * 2, l, r) + find(x * 2 + 1, l, r);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    int val = 1;
    while (x) {
      v[i][x % 10] += val;
      val *= 10;
      x /= 10;
    }
  }
  build(1, 1, n);
  while (m--) {
    scanf("%d", &opt);
    if (opt == 1) {
      scanf("%d%d%d%d", &l, &r, &x, &y);
      insert(1, l, r, x, y);
    } else {
      scanf("%d%d", &l, &r);
      printf("%lld\n", find(1, l, r));
    }
  }
  return 0;
}
