func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e5 + 7;   int a[N], n, q;   long long sum[N << 2][11], mul[11] = {1};   long long SUM[11], LA[11];   int lazy[N << 2][11];   void pushup(int rt) {     for (int i = 0; i < 10; ++i) {       sum[rt][i] = sum[rt << 1][i] + sum[rt << 1 | 1][i];     }   }   void pushdown(int rt) {     for (int i = 0; i < 10; ++i)       SUM[i] = sum[rt << 1][i], LA[i] = lazy[rt << 1][i];     for (int i = 0; i < 10; ++i) {       int u = i, v = lazy[rt][i];       if (u == v) continue;       for (int j = 0; j < 10; ++j) {         if (lazy[rt << 1][j] == u) {           LA[j] = lazy[rt][i];         }       }       SUM[lazy[rt][i]] += sum[rt << 1][i];       SUM[i] -= sum[rt << 1][i];     }     for (int i = 0; i < 10; ++i)       sum[rt << 1][i] = SUM[i], lazy[rt << 1][i] = LA[i];     for (int i = 0; i < 10; ++i)       SUM[i] = sum[rt << 1 | 1][i], LA[i] = lazy[rt << 1 | 1][i];     for (int i = 0; i < 10; ++i) {       int u = i, v = lazy[rt][i];       if (u == v) continue;       for (int j = 0; j < 10; ++j) {         if (lazy[rt << 1 | 1][j] == u) {           LA[j] = lazy[rt][i];         }       }       SUM[lazy[rt][i]] += sum[rt << 1 | 1][i];       SUM[i] -= sum[rt << 1 | 1][i];     }     for (int i = 0; i < 10; ++i)       sum[rt << 1 | 1][i] = SUM[i], lazy[rt << 1 | 1][i] = LA[i];     for (int i = 0; i < 10; ++i) lazy[rt][i] = i;   }   void build(int l, int r, int rt) {     for (int i = 0; i < 10; ++i) lazy[rt][i] = i;     if (l == r) {       int x = a[l], index = 0;       while (x) {         int y = x % 10;         x /= 10;         sum[rt][y] += mul[index];         index++;       }       return;     }     int mid = (l + r) >> 1;     build(l, mid, rt << 1);     build(mid + 1, r, rt << 1 | 1);     pushup(rt);   }   void update(int l, int r, int rt, int L, int R, int x, int y) {     if (L <= l && r <= R) {       for (int j = 0; j < 10; ++j) {         if (lazy[rt][j] == x) {           lazy[rt][j] = y;           sum[rt][y] += sum[rt][x];           sum[rt][x] = 0;         }       }       return;     }     pushdown(rt);     int mid = (l + r) >> 1;     if (L <= mid) update(l, mid, rt << 1, L, R, x, y);     if (R > mid) update(mid + 1, r, rt << 1 | 1, L, R, x, y);     pushup(rt);   }   long long query(int l, int r, int rt, int L, int R) {     if (L <= l && r <= R) {       long long ret = 0;       for (int i = 0; i < 10; ++i) ret += sum[rt][i] * i;       return ret;     }     pushdown(rt);     int mid = (l + r) >> 1;     long long ret = 0;     if (L <= mid) ret += query(l, mid, rt << 1, L, R);     if (R > mid) ret += query(mid + 1, r, rt << 1 | 1, L, R);     return ret;   }   int main() {     for (int i = 1; i < 11; ++i) mul[i] = mul[i - 1] * 10;     scanf( %d%d , &n, &q);     for (int i = 1; i <= n; ++i) {       scanf( %d , &a[i]);     }     build(1, n, 1);     while (q--) {       int op, L, R, x, y;       scanf( %d , &op);       if (op == 1) {         scanf( %d%d%d%d , &L, &R, &x, &y);         if (x == y) continue;         update(1, n, 1, L, R, x, y);       } else {         scanf( %d%d , &L, &R);         printf( %lld n , query(1, n, 1, L, R));       }     }     return 0;   }   