#include <bits/stdc++.h>
using namespace std;
const int N = 5e7;
const long long INF = 1e9 + 10;
const int MOD = 1e18 + 7;
struct segtree {
  struct node {
    long long cnt[10];
    int add[10];
  };
  vector<node> tree;
  int size = 1;
  node ZERO() {
    node ans;
    for (int i = 0; i < 10; i++) ans.cnt[i] = 0;
    for (int i = 0; i < 10; i++) ans.add[i] = i;
    return ans;
  }
  node combine(node& a, node& b) {
    node ans;
    for (int i = 0; i < 10; i++) {
      ans.cnt[i] = a.cnt[i] + b.cnt[i];
    }
    for (int i = 0; i < 10; i++) ans.add[i] = i;
    return ans;
  }
  void build(int u, int l, int r, vector<long long>& x, int n) {
    if (l == r) {
      for (int i = 0; i < 10; i++) tree[u].add[i] = i;
      for (int i = 0; i < 10; i++) tree[u].cnt[i] = 0;
      if (l > n) return;
      long long pow = 1;
      for (int i = 0; i < 10; i++) {
        int dig = x[l - 1] % 10;
        tree[u].cnt[dig] += pow;
        x[l - 1] /= 10;
        pow *= 10;
        if (x[l - 1] == 0) break;
      }
      return;
    }
    int m = (l + r) / 2;
    build(2 * u, l, m, x, n);
    build(2 * u + 1, m + 1, r, x, n);
    tree[u] = combine(tree[2 * u], tree[2 * u + 1]);
  }
  void init(vector<long long>& x) {
    int n = x.size();
    while (size < n) size *= 2;
    tree.assign(2 * size, ZERO());
    build(1, 1, size, x, n);
  }
  void push(int u, int l, int r) {
    if (l == r) return;
    long long sum[10];
    for (int i = 0; i < 10; i++) sum[i] = 0;
    for (int i = 0; i < 10; i++) {
      sum[tree[u].add[i]] += (tree[2 * u].cnt[i]);
    }
    for (int i = 0; i < 10; i++) tree[2 * u].cnt[i] = sum[i];
    for (int i = 0; i < 10; i++) sum[i] = 0;
    for (int i = 0; i < 10; i++) {
      sum[tree[u].add[i]] += (tree[2 * u + 1].cnt[i]);
    }
    for (int i = 0; i < 10; i++) tree[2 * u + 1].cnt[i] = sum[i];
    for (int i = 0; i < 10; i++) {
      tree[2 * u].add[i] = tree[u].add[tree[2 * u].add[i]];
      tree[2 * u + 1].add[i] = tree[u].add[tree[2 * u + 1].add[i]];
    }
    for (int i = 0; i < 10; i++) tree[u].add[i] = i;
  }
  void set(int lx, int rx, int x, int y, int l, int r, int u) {
    push(u, l, r);
    if (lx > r || l > rx) return;
    if (l >= lx && r <= rx) {
      tree[u].cnt[y] += (tree[u].cnt[x]);
      tree[u].cnt[x] = 0;
      tree[u].add[x] = y;
      for (int i = 0; i < 10; i++) {
        if (tree[u].add[i] == x) tree[u].add[i] = y;
      }
      return;
    }
    int m = (l + r) / 2;
    set(lx, rx, x, y, l, m, 2 * u);
    set(lx, rx, x, y, m + 1, r, 2 * u + 1);
    tree[u] = combine(tree[2 * u], tree[2 * u + 1]);
  }
  void set(int l, int r, int x, int y) { set(l, r, x, y, 1, size, 1); }
  node calc(int lx, int rx, int l, int r, int u) {
    push(u, l, r);
    if (l > rx || lx > r) return ZERO();
    if (l >= lx && r <= rx) {
      return tree[u];
    }
    int m = (l + r) / 2;
    node a = calc(lx, rx, l, m, 2 * u), b = calc(lx, rx, m + 1, r, 2 * u + 1);
    return combine(a, b);
  }
  long long calc(int l, int r) {
    node a = calc(l, r, 1, size, 1);
    long long res = 0;
    for (long long i = 0; i < 10; i++) res += (a.cnt[i] * i);
    return res;
  }
};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, q;
  cin >> n >> q;
  vector<long long> x(n, 0);
  for (int i = 0; i < n; i++) cin >> x[i];
  segtree sg;
  sg.init(x);
  while (q--) {
    int c;
    cin >> c;
    if (c == 1) {
      int l, r, x, y;
      cin >> l >> r >> x >> y;
      if (x != y) sg.set(l, r, x, y);
    } else {
      int l, r;
      cin >> l >> r;
      cout << sg.calc(l, r) << '\n';
    }
  }
}
