#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int v[N];
struct Node {
  long long sum;
  long long value[11], next[11];
  Node() {
    sum = 0;
    for (int i = 0; i <= 9; i++) next[i] = i;
    for (int i = 0; i <= 9; i++) value[i] = 0;
  }
  void updateNode(Node *left, Node *right) {
    sum = left->sum + right->sum;
    for (int i = 0; i <= 9; i++) value[i] = left->value[i] + right->value[i];
  }
};
struct SegTree {
  Node *seg[4 * N + 1];
  int n, a, b, k1, k2;
  SegTree() {}
  SegTree(int n) : n(n) { build(1, 0, n); }
  void build(int r, int i, int j) {
    if (i == j) {
      int base = 1;
      seg[r] = new Node();
      while (v[i]) {
        seg[r]->value[v[i] % 10] += base;
        v[i] /= 10;
        base *= 10;
      }
    } else {
      int mid = (i + j) / 2;
      build(r * 2, i, mid);
      build(r * 2 + 1, mid + 1, j);
      seg[r] = new Node();
      seg[r]->updateNode(seg[r * 2], seg[r * 2 + 1]);
    }
  }
  void prop(int r, int x, int y) {
    long long aux[11];
    for (int i = 0; i <= 9; i++) {
      aux[i] = seg[r]->value[i];
      seg[r]->value[i] = 0;
    }
    seg[r]->sum = 0;
    for (int i = 0; i <= 9; i++) {
      seg[r]->value[seg[r]->next[i]] += aux[i];
    }
    for (int i = 0; i <= 9; i++) {
      seg[r]->sum += i * seg[r]->value[i];
    }
    if (x != y) {
      int filho = 2 * r;
      for (int k = 0; k < 2; k++) {
        filho += k;
        for (int j = 0; j <= 9; j++) {
          seg[filho]->next[j] = seg[r]->next[seg[filho]->next[j]];
        }
      }
    }
    for (int i = 0; i <= 9; i++) seg[r]->next[i] = i;
  }
  long long query(int r, int i, int j) {
    prop(r, i, j);
    if (i > b or j < a) return 0;
    if (i >= a and j <= b) {
      if (k1 == -1) return seg[r]->sum;
      seg[r]->next[k1] = k2;
      prop(r, i, j);
      return seg[r]->sum;
    }
    int mid = (i + j) / 2;
    long long le = query(r * 2, i, mid);
    long long ri = query(r * 2 + 1, mid + 1, j);
    seg[r]->updateNode(seg[r * 2], seg[r * 2 + 1]);
    return le + ri;
  }
  long long query(int x, int y) {
    a = x - 1;
    b = y - 1;
    k1 = -1;
    return query(1, 0, n);
  }
  void update(int x, int y, int u, int v) {
    a = x - 1;
    b = y - 1;
    k1 = u, k2 = v;
    query(1, 0, n);
  }
} st;
int main(void) {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%d", v + i);
  }
  st = SegTree(n - 1);
  while (m--) {
    int t, l, r, x, y;
    scanf("%d %d %d", &t, &l, &r);
    if (t == 1) {
      scanf("%d %d", &x, &y);
      st.update(l, r, x, y);
    } else {
      cout << st.query(l, r) << endl;
    }
  }
  return 0;
}
