#include <iostream>
#include <string>
#include <string.h>
using namespace std;
struct Node {
long sum;
int CountV[10];
int pending;
} ;
Node *Tree;
int max(int a, int b) {
if (a > b) return a;
else return b;
}
int min(int a, int b) {
if (a < b) return a;
else return b;
}
void AddMod(int U, int delt) {
//cout << "!!"<<U<<" "<<delt<<endl;
int temp[10];
memcpy(temp, Tree[U].CountV, 10 * sizeof(int));
for (int i = 0;i<10;i++)
Tree[U].CountV[(i + delt) % 10] = temp[i];
}
void addV(int &x, int y) {
x += y;
x %= 10;
}
void relax(int U, int d){
AddMod(U, d);
addV(Tree[U].pending, d);
Tree[U].sum = 0;
for (int i = 0;i<10;i++)
Tree[U].sum += i*Tree[U].CountV[i];
}
void forcePush(int U){
relax(2*U,Tree[U].pending);
relax(2*U + 1,Tree[U].pending);
Tree[U].pending = 0;
Tree[U].sum = 0;
for (int i = 0;i<10;i++)
Tree[U].sum += i*(Tree[U].CountV[i] = Tree[2 * U].CountV[i] + Tree[2 * U + 1].CountV[i]);
}
void add(int U, int L, int R, int l, int r, int val) {
//cout <<U<<" "<<L<<" "<<R<<" "<<l<<" "<<r<<" <---> "<<val<<endl;
if (L >= r || R <= l) return;
l = max(l, L);
r = min(R, r);
if (L == l && R == r) {
relax(U,val);
//cout << " <---> "<<"?"<<Tree[U].sum<<endl;
return;
}
forcePush(U);
add(2 * U, L, (L + R) >> 1, l, r, val);
add(2 * U + 1, (L + R) >> 1, R, l, r, val);
forcePush(U);
}
long getSum(int U, int L, int R, int l, int r) {
if (L >= r || R <= l)
return 0;
l = max(l, L);
r = min(R, r);
if (L == l && R == r)
return Tree[U].sum;
forcePush(U);
long res = getSum(2 * U, L, (L + R) >> 1, l, r) + getSum(2 * U + 1, (L + R) >> 1, R, l, r);
//cout <<U<<" "<<L<<" "<<R<<" "<<l<<" "<<r<<" ---> "<<res<<endl;
return res;
}
int *INIT;
void init(int U, int L, int R){
if (L >= R) return;
if (L + 1 == R){
Tree[U].CountV[ INIT[L] ] = 1;
Tree[U].sum = INIT[L];
return;
}
init(2*U,L, (L + R) >> 1);
init(2*U+1,(L + R) >> 1,R);
for (int i = 0;i<10;i++)
Tree[U].sum += i*(Tree[U].CountV[i] = Tree[2 * U].CountV[i] + Tree[2 * U + 1].CountV[i]);
}
int main()
{
int size, opNumber;
cin >> size >> opNumber;
Tree = new Node[4 * size];
memset(Tree,0,sizeof(Node)*4*size);
INIT = new int[size];
for (int i = 0; i < size; i++)
cin >> INIT[i];
init(1,0,size);
int left, right;
for (int i = 0; i < opNumber; i++) {
int app;
//cout << endl<<endl<<endl;
cin >> app >> left >> right;
if (app == 1)
cout << getSum(1, 0, size, left - 1, right) << endl;
else {
cin >> app;
add(1,0,size, left-1,right, app);
}
}
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHN0cmluZy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnN0cnVjdCBOb2RlIHsKCWxvbmcgc3VtOwoJaW50IENvdW50VlsxMF07CglpbnQgcGVuZGluZzsKfSA7CgoJTm9kZSAqVHJlZTsKCmludCBtYXgoaW50IGEsIGludCBiKSB7CglpZiAoYSA+IGIpIHJldHVybiBhOwoJZWxzZSByZXR1cm4gYjsKfQoKaW50IG1pbihpbnQgYSwgaW50IGIpIHsKCWlmIChhIDwgYikgcmV0dXJuIGE7CgllbHNlIHJldHVybiBiOwp9CgoKdm9pZCBBZGRNb2QoaW50IFUsIGludCBkZWx0KSB7Ci8vY291dCA8PCAiISEiPDxVPDwiICI8PGRlbHQ8PGVuZGw7CglpbnQgdGVtcFsxMF07CgltZW1jcHkodGVtcCwgVHJlZVtVXS5Db3VudFYsIDEwICogc2l6ZW9mKGludCkpOwoJZm9yIChpbnQgaSA9IDA7aTwxMDtpKyspCgkJVHJlZVtVXS5Db3VudFZbKGkgKyBkZWx0KSAlIDEwXSA9IHRlbXBbaV07Cn0KCnZvaWQgYWRkVihpbnQgJngsIGludCB5KSB7Cgl4ICs9IHk7Cgl4ICU9IDEwOwp9Cgp2b2lkIHJlbGF4KGludCBVLCBpbnQgZCl7CiAgICBBZGRNb2QoVSwgZCk7CiAgICBhZGRWKFRyZWVbVV0ucGVuZGluZywgZCk7CiAgICBUcmVlW1VdLnN1bSA9IDA7Cglmb3IgKGludCBpID0gMDtpPDEwO2krKykKCQkJVHJlZVtVXS5zdW0gKz0gaSpUcmVlW1VdLkNvdW50VltpXTsKfQoKdm9pZCBmb3JjZVB1c2goaW50IFUpewoKCXJlbGF4KDIqVSxUcmVlW1VdLnBlbmRpbmcpOwoJcmVsYXgoMipVICsgMSxUcmVlW1VdLnBlbmRpbmcpOwoKCVRyZWVbVV0ucGVuZGluZyA9IDA7CglUcmVlW1VdLnN1bSA9IDA7Cglmb3IgKGludCBpID0gMDtpPDEwO2krKykKCQlUcmVlW1VdLnN1bSArPSBpKihUcmVlW1VdLkNvdW50VltpXSA9IFRyZWVbMiAqIFVdLkNvdW50VltpXSArIFRyZWVbMiAqIFUgKyAxXS5Db3VudFZbaV0pOwp9Cgp2b2lkIGFkZChpbnQgVSwgaW50IEwsIGludCBSLCBpbnQgbCwgaW50IHIsIGludCB2YWwpIHsKICAgIC8vY291dCA8PFU8PCIgIjw8TDw8IiAiPDxSPDwiICI8PGw8PCIgIjw8cjw8IiA8LS0tPiAiPDx2YWw8PGVuZGw7CglpZiAoTCA+PSByIHx8IFIgPD0gbCkgcmV0dXJuOwoJbCA9IG1heChsLCBMKTsKCXIgPSBtaW4oUiwgcik7CglpZiAoTCA9PSBsICYmIFIgPT0gcikgewoJICAgIHJlbGF4KFUsdmFsKTsKCQkvL2NvdXQgPDwgIiA8LS0tPiAiPDwiPyI8PFRyZWVbVV0uc3VtPDxlbmRsOwkKCQlyZXR1cm47Cgl9Cglmb3JjZVB1c2goVSk7CglhZGQoMiAqIFUsIEwsIChMICsgUikgPj4gMSwgbCwgciwgdmFsKTsKCWFkZCgyICogVSArIDEsIChMICsgUikgPj4gMSwgUiwgbCwgciwgdmFsKTsKCWZvcmNlUHVzaChVKTsKCn0KCgoKbG9uZyBnZXRTdW0oaW50IFUsIGludCBMLCBpbnQgUiwgaW50IGwsIGludCByKSB7CglpZiAoTCA+PSByIHx8IFIgPD0gbCkKCSAgIHJldHVybiAwOwoJbCA9IG1heChsLCBMKTsKCXIgPSBtaW4oUiwgcik7CglpZiAoTCA9PSBsICYmIFIgPT0gcikgCgkJcmV0dXJuIFRyZWVbVV0uc3VtOwoJZm9yY2VQdXNoKFUpOwoJbG9uZyByZXMgPSBnZXRTdW0oMiAqIFUsIEwsIChMICsgUikgPj4gMSwgbCwgcikgKyBnZXRTdW0oMiAqIFUgKyAxLCAoTCArIFIpID4+IDEsIFIsIGwsIHIpOwoKICAgIC8vY291dCA8PFU8PCIgIjw8TDw8IiAiPDxSPDwiICI8PGw8PCIgIjw8cjw8IiAtLS0+ICI8PHJlczw8ZW5kbDsKCXJldHVybiByZXM7Cn0KaW50ICpJTklUOwoKdm9pZCBpbml0KGludCBVLCBpbnQgTCwgaW50IFIpewogICAgaWYgKEwgPj0gUikgcmV0dXJuOwogICAgaWYgKEwgKyAxID09IFIpewogICAgICAgIFRyZWVbVV0uQ291bnRWWyBJTklUW0xdIF0gPSAxOwogICAgICAgIFRyZWVbVV0uc3VtID0gSU5JVFtMXTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbml0KDIqVSxMLCAoTCArIFIpID4+IDEpOwogICAgaW5pdCgyKlUrMSwoTCArIFIpID4+IDEsUik7Cglmb3IgKGludCBpID0gMDtpPDEwO2krKykKCQlUcmVlW1VdLnN1bSArPSBpKihUcmVlW1VdLkNvdW50VltpXSA9IFRyZWVbMiAqIFVdLkNvdW50VltpXSArIFRyZWVbMiAqIFUgKyAxXS5Db3VudFZbaV0pOwp9CgppbnQgbWFpbigpCnsKCWludCBzaXplLCBvcE51bWJlcjsKCWNpbiA+PiBzaXplID4+IG9wTnVtYmVyOwoKCVRyZWUgPSBuZXcgTm9kZVs0ICogc2l6ZV07CgltZW1zZXQoVHJlZSwwLHNpemVvZihOb2RlKSo0KnNpemUpOwoJSU5JVCA9IG5ldyBpbnRbc2l6ZV07CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCgkJY2luID4+IElOSVRbaV07CiAgICBpbml0KDEsMCxzaXplKTsKCWludCBsZWZ0LCByaWdodDsKCglmb3IgKGludCBpID0gMDsgaSA8IG9wTnVtYmVyOyBpKyspIHsKICAgICAgICBpbnQgYXBwOwogICAgICAgIC8vY291dCA8PCBlbmRsPDxlbmRsPDxlbmRsOwoJCWNpbiA+PiBhcHAgPj4gbGVmdCA+PiByaWdodDsKICAgICAgICBpZiAoYXBwID09IDEpCiAgICAgICAgICAgIGNvdXQgPDwgZ2V0U3VtKDEsIDAsIHNpemUsIGxlZnQgLSAxLCByaWdodCkgPDwgZW5kbDsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY2luID4+IGFwcDsKICAgICAgICAgICAgYWRkKDEsMCxzaXplLCBsZWZ0LTEscmlnaHQsIGFwcCk7CiAgICAgICAgfQoJfQoKCiAgICByZXR1cm4gMDsKfQoK