#include <bits/stdc++.h>
struct sgt {
  struct node {
    int l, r, ls, rs, tag[10];
    long long cnt[10];
  };
  node a[500005];
  int n, cnt, num;
  void put(int k, int fr, int to) {
    for (int i = 0; i <= 9; i++)
      if (a[k].tag[i] == fr) {
        a[k].tag[i] = to;
      }
  }
  void putall(int k, int lst) {
    long long t[15];
    for (int i = 0; i <= 9; i++) t[i] = a[lst].tag[a[k].tag[i]];
    for (int i = 0; i <= 9; i++) a[k].tag[i] = t[i];
  }
  void pushdown(int k) {
    putall(a[k].ls, k), putall(a[k].rs, k);
    long long t[15];
    for (int i = 0; i <= 9; i++) t[i] = 0;
    for (int i = 0; i <= 9; i++) t[a[k].tag[i]] = t[a[k].tag[i]] + a[k].cnt[i];
    for (int i = 0; i <= 9; i++) a[k].cnt[i] = t[i];
    for (int i = 0; i <= 9; i++) a[k].tag[i] = i;
  }
  void pushup(int k) {
    for (int i = 0; i <= 9; i++) a[k].cnt[i] = 0;
    for (int i = 0; i <= 9; i++)
      a[k].cnt[a[a[k].ls].tag[i]] =
          a[k].cnt[a[a[k].ls].tag[i]] + a[a[k].ls].cnt[i];
    for (int i = 0; i <= 9; i++)
      a[k].cnt[a[a[k].rs].tag[i]] =
          a[k].cnt[a[a[k].rs].tag[i]] + a[a[k].rs].cnt[i];
  }
  long long calc(int k) {
    long long s = 0;
    for (int i = 0; i <= 9; i++) s = s + 1ll * a[k].cnt[i] * a[k].tag[i];
    return s;
  }
  void build(int k, int l, int r) {
    a[k].l = l, a[k].r = r;
    for (int i = 0; i <= 9; i++) a[k].tag[i] = i, a[k].cnt[i] = 0;
    if (a[k].l == a[k].r) return;
    int mid = (a[k].l + a[k].r) / 2;
    a[k].ls = ++cnt, a[k].rs = ++cnt;
    build(a[k].ls, a[k].l, mid);
    build(a[k].rs, mid + 1, a[k].r);
    pushup(k);
  }
  void addcnt(int k, int x, int y, long long w) {
    if (a[k].l == a[k].r) return a[k].cnt[y] = a[k].cnt[y] + w, void();
    int mid = (a[k].l + a[k].r) / 2;
    pushdown(k);
    if (x <= mid) addcnt(a[k].ls, x, y, w);
    if (mid < x) addcnt(a[k].rs, x, y, w);
    pushup(k);
  }
  void update(int k, int x, int y, int fr, int to) {
    if (x <= a[k].l && a[k].r <= y) return put(k, fr, to), void();
    int mid = (a[k].l + a[k].r) / 2;
    pushdown(k);
    if (x <= mid) update(a[k].ls, x, y, fr, to);
    if (mid < y) update(a[k].rs, x, y, fr, to);
    pushup(k);
  }
  long long query(int k, int x, int y) {
    if (x <= a[k].l && a[k].r <= y) return calc(k);
    int mid = (a[k].l + a[k].r) / 2;
    long long ans = 0;
    pushdown(k);
    if (x <= mid) ans = ans + query(a[k].ls, x, y);
    if (mid < y) ans = ans + query(a[k].rs, x, y);
    return ans;
  }
  void pre(int sz) {
    n = sz;
    cnt = 1;
    build(1, 1, n);
  }
  void add(int x, int y, int w) { addcnt(1, x, y, w); }
  void upd(int x, int y, int fr, int to) { update(1, x, y, fr, to); }
  long long ask(int x, int y) { return query(1, x, y); }
  void print() {
    printf("Tree T = %d\n", num);
    printf("node sum = %d\n", cnt);
    for (int i = 1; i <= cnt; i++) {
      printf("node %d:[%d,%d](%d,%d)\n", i, a[i].l, a[i].r, a[i].ls, a[i].rs);
      printf("Number : ");
      for (int k = 0; k <= 9; k++) printf("%2d ", k);
      puts("");
      printf("Tag    : ");
      for (int k = 0; k <= 9; k++) printf("%2d ", a[i].tag[k]);
      puts("");
      printf("Count  : ");
      for (int k = 0; k <= 9; k++) printf("%2d ", a[i].cnt[k]);
      puts("");
      puts("");
    }
    puts("---end---");
  }
};
sgt t;
int n, q;
int read() {
  int x = 0;
  char ch = 0;
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();
  return x;
}
signed main() {
  n = read(), q = read();
  t.pre(n);
  for (int i = 1; i <= n; i++) {
    int x = read();
    long long w = 1;
    for (int k = 0; k <= 8; k++) {
      if (!x) continue;
      t.add(i, x % 10, w);
      x = x / 10;
      w = w * 10;
    }
  }
  while (q--) {
    int opt = read();
    if (opt == 1) {
      int l, r, x, y;
      l = read(), r = read(), x = read(), y = read();
      t.upd(l, r, x, y);
    } else if (opt == 2) {
      int l, r;
      l = read(), r = read();
      long long ans = 0;
      ans = t.ask(l, r);
      printf("%lld\n", ans);
    }
  }
  return 0;
}
