#include <bits/stdc++.h>
using namespace std;
const pair<int, int> DD[] = {{1, 0},  {1, 1},   {0, 1},  {-1, 1},
                             {-1, 0}, {-1, -1}, {0, -1}, {1, -1}};
template <class T>
T smin(T &a, T b) {
  if (a > b) a = b;
  return a;
}
template <class T>
T smax(T &a, T b) {
  if (a < b) a = b;
  return a;
}
static int lz[1 << 20][10];
static long long t[1 << 20][10];
void up(int node) {
  for (int k = 0; k < 10; ++k)
    t[node][k] = t[node << 1][k] + t[node << 1 | 1][k];
}
void init(int node) {
  for (int k = 0; k < 10; ++k) lz[node][k] = k;
}
void go(int node1, int node2) {
  static int nxt[10];
  for (int k = 0; k < 10; ++k) nxt[k] = lz[node1][lz[node2][k]];
  for (int k = 0; k < 10; ++k) lz[node2][k] = nxt[k];
}
void lazy(int p, int u, int node) {
  static long long nxt[10];
  for (int k = 0; k < 10; ++k) nxt[k] = 0;
  for (int k = 0; k < 10; ++k) nxt[lz[node][k]] += t[node][k];
  for (int k = 0; k < 10; ++k) t[node][k] = nxt[k];
  if (p != u) go(node, node << 1), go(node, node << 1 | 1);
  init(node);
}
int v[1 << 20];
void build(int p, int u, int node) {
  init(node);
  if (p == u) {
    long long cnt = v[p];
    long long pw = 1;
    while (cnt) t[node][cnt % 10] += pw, pw *= 10, cnt /= 10;
  } else {
    int m = (p + u) / 2;
    build(p, m, node << 1);
    build(m + 1, u, node << 1 | 1);
    up(node);
  }
}
void update(int p, int u, int l, int r, int first, int second, int node) {
  lazy(p, u, node);
  if (l <= p && u <= r)
    lz[node][first] = second, lazy(p, u, node);
  else {
    int m = (p + u) / 2;
    if (l <= m)
      update(p, m, l, r, first, second, node << 1);
    else
      lazy(p, m, node << 1);
    if (m + 1 <= r)
      update(m + 1, u, l, r, first, second, node << 1 | 1);
    else
      lazy(m + 1, u, node << 1 | 1);
    up(node);
  }
}
long long query(int p, int u, int l, int r, int node) {
  lazy(p, u, node);
  if (l <= p && u <= r) {
    long long ans = 0;
    for (int k = 0; k < 10; ++k) ans += k * t[node][k];
    return ans;
  } else {
    int m = (p + u) / 2;
    long long ans = 0;
    if (l <= m) ans += query(p, m, l, r, node << 1);
    if (m + 1 <= r) ans += query(m + 1, u, l, r, node << 1 | 1);
    return ans;
  }
}
int main(void) {
  srand(time(0));
  cout << fixed << setprecision(7);
  cerr << fixed << setprecision(7);
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) cin >> v[i];
  build(1, n, 1);
  while (m--) {
    int op;
    cin >> op;
    if (op == 1) {
      int l, r, first, second;
      cin >> l >> r >> first >> second;
      update(1, n, l, r, first, second, 1);
    } else {
      int l, r;
      cin >> l >> r;
      cout << query(1, n, l, r, 1) << '\n';
    }
  }
  cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms"
       << '\n';
  return 0;
}
