- #include<iostream> 
- #include<stdio.h> 
- #include<functional> 
- #include<algorithm> 
- #include<math.h> 
- #include<limits.h> 
- #include<time.h> 
- #include<set> 
- #include<vector> 
- #include<map> 
- #include<queue> 
- #include<stack> 
- #include<deque> 
-   
- #include<cstring> 
- #include<string> 
-   
-   
- #define FOR(i,a,b) for(int i=a;i<=b;i++) 
- #define FORD(i,a,b) for(int i=a;i>=b;i--) 
- #define pb push_back  
- #define lli long long int 
- #define mod1 1000000007 
- #define mod2 1000000009 
- #define ppi pair<int,int> 
- #define tr(a,it) for(typeof(a.begin()) it=a.begin();it!=a.end();it++) 
-   
- using namespace std; 
-   
- int segtree[13][20*100001]; 
- int force[20*100001]; 
- int br[13][20*100001]; 
- int ar[3000001]; 
- vector<int>de[3000001]; 
-   
-   
- int build(int fr,int node,int f,int l) 
- { 
-     force[node]=0; 
-   
-     if(f==l) 
-     { 
-             segtree[fr][node]=br[fr][f]; 
-   
-             return segtree[fr][node]; 
-     } 
-   
-     int b1=build(fr,2*node,f,(f+l)/2); 
-     int b2=build(fr,2*node+1,((f+l)/2)+1,l); 
-   
-     segtree[fr][node]=max(b1,b2); 
-   
-     return segtree[fr][node]; 
- } 
-   
- int update(int node,int f,int l,int x,int y,int fr) 
- { 
-     if(l<x||y<f||f>l) 
-     { 
-     return 0; 
-     } 
-   
-     int br[2][13]; 
-     if(x<=f&&l<=y) 
-     { 
-                   force[node]+=fr; 
-   
-                   FOR(i,0,12)br[0][i]=segtree[i][node]; 
-   
-                   FOR(i,0,12)segtree[i][node]=br[0][(i+fr)%12]; 
-   
-                   return 0; 
-     } 
-   
-     force[2*node]=+force[node]; 
-     force[2*node+1]=+force[node]; 
-   
-     FOR(i,0,12) 
-     { 
-               br[0][i]=segtree[i][2*node]; 
-               br[1][i]=segtree[i][2*node+1]; 
-     } 
-   
-     FOR(i,0,12) 
-     { 
-               segtree[i][2*node]=br[0][(i+force[node])%12]; 
-               segtree[i][2*node+1]=br[1][(i+force[node])%12]; 
-     } 
-   
-     force[node]=0; 
-   
-     update(2*node,f,(f+l)/2,x,y,fr); 
-     update(2*node+1,((f+l)/2)+1,l,x,y,fr); 
-   
-     FOR(i,0,12)segtree[i][node]=max(segtree[i][2*node],segtree[i][2*node+1]); 
-   
-     return 0; 
- } 
-   
- int query(int node,int f,int l,int x,int y,int fi) 
- { 
-       if(l<x||y<f||f>l)return 0; 
-       else 
-       if(x <= f &&l <= y) 
-       { 
-                   return segtree[(fi)%12][node]; 
-       } 
-   
-       fi+=force[node]; 
-   
-       int q1=query(2*node,f,(f+l)/2,x,y,fi); 
-       int q2=query(2*node+1,((f+l)/2)+1,l,x,y,fi); 
-   
-       return max(q1,q2); 
- } 
-   
- int main() 
- { 
-     //clock_t start=clock(); 
-     int n; 
-     scanf("%d",&n); 
-   
-     FOR(i,1,n)scanf("%d",&ar[i]); 
-   
-     FOR(i,1,n) 
-     { 
-               int x=ar[i]; 
-               while(x>0) 
-               { 
-                        de[i].pb(x%10); 
-                        x=(x-x%10)/10; 
-               } 
-   
-               FOR(z,0,12) 
-               { 
-                int y=0; 
-   
-               int sz=de[i].size(); 
-   
-               FORD(j,sz-1,0) 
-               { 
-                        y*=10; 
-                        y+=de[i][(j-z+12*sz)%sz]; 
-   
-               } 
-   
-                      br[z][i]=y; 
-   
-               } 
-     } 
-   
-     FOR(i,0,12) 
-     { 
-               build(i,1,1,n); 
-     } 
-   
-   
-     int m; 
-     scanf("%d",&m); 
-   
-     while(m--) 
-     { 
-               int qu; 
-               scanf("%d",&qu); 
-   
-               int l,r,f; 
-   
-               scanf("%d%d",&l,&r); 
-   
-               if(qu==0) 
-               { 
-                  scanf("%d",&f); 
-                  update(1,1,n,l+1,r+1,f%12); 
-   
-               } 
-               else 
-               { 
-                   printf("%d\n",query(1,1,n,l+1,r+1,0)); 
-               } 
-     } 
-   
-      //while(clock()-start<0.95*CLOCKS_PER_SEC); 
-     return 0; 
- }  
-   
				I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHN0ZGlvLmg+CiNpbmNsdWRlPGZ1bmN0aW9uYWw+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8bWF0aC5oPgojaW5jbHVkZTxsaW1pdHMuaD4KI2luY2x1ZGU8dGltZS5oPgojaW5jbHVkZTxzZXQ+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8bWFwPgojaW5jbHVkZTxxdWV1ZT4KI2luY2x1ZGU8c3RhY2s+CiNpbmNsdWRlPGRlcXVlPgogCiNpbmNsdWRlPGNzdHJpbmc+CiNpbmNsdWRlPHN0cmluZz4KIAogCiNkZWZpbmUgRk9SKGksYSxiKSBmb3IoaW50IGk9YTtpPD1iO2krKykKI2RlZmluZSBGT1JEKGksYSxiKSBmb3IoaW50IGk9YTtpPj1iO2ktLSkKI2RlZmluZSBwYiBwdXNoX2JhY2sgCiNkZWZpbmUgbGxpIGxvbmcgbG9uZyBpbnQKI2RlZmluZSBtb2QxIDEwMDAwMDAwMDcKI2RlZmluZSBtb2QyIDEwMDAwMDAwMDkKI2RlZmluZSBwcGkgcGFpcjxpbnQsaW50PgojZGVmaW5lIHRyKGEsaXQpIGZvcih0eXBlb2YoYS5iZWdpbigpKSBpdD1hLmJlZ2luKCk7aXQhPWEuZW5kKCk7aXQrKykKIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCmludCBzZWd0cmVlWzEzXVsyMCoxMDAwMDFdOwppbnQgZm9yY2VbMjAqMTAwMDAxXTsKaW50IGJyWzEzXVsyMCoxMDAwMDFdOwppbnQgYXJbMzAwMDAwMV07CnZlY3RvcjxpbnQ+ZGVbMzAwMDAwMV07CgoKaW50IGJ1aWxkKGludCBmcixpbnQgbm9kZSxpbnQgZixpbnQgbCkKewogICAgZm9yY2Vbbm9kZV09MDsKIAogICAgaWYoZj09bCkKICAgIHsKICAgICAgICAgICAgc2VndHJlZVtmcl1bbm9kZV09YnJbZnJdW2ZdOwogCiAgICAgICAgICAgIHJldHVybiBzZWd0cmVlW2ZyXVtub2RlXTsKICAgIH0KIAogICAgaW50IGIxPWJ1aWxkKGZyLDIqbm9kZSxmLChmK2wpLzIpOwogICAgaW50IGIyPWJ1aWxkKGZyLDIqbm9kZSsxLCgoZitsKS8yKSsxLGwpOwogCiAgICBzZWd0cmVlW2ZyXVtub2RlXT1tYXgoYjEsYjIpOwogCiAgICByZXR1cm4gc2VndHJlZVtmcl1bbm9kZV07Cn0KIAppbnQgdXBkYXRlKGludCBub2RlLGludCBmLGludCBsLGludCB4LGludCB5LGludCBmcikKewogICAgaWYobDx4fHx5PGZ8fGY+bCkKICAgIHsKICAgIHJldHVybiAwOwogICAgfQogCiAgICBpbnQgYnJbMl1bMTNdOwogICAgaWYoeDw9ZiYmbDw9eSkKICAgIHsKICAgICAgICAgICAgICAgICAgZm9yY2Vbbm9kZV0rPWZyOwogCiAgICAgICAgICAgICAgICAgIEZPUihpLDAsMTIpYnJbMF1baV09c2VndHJlZVtpXVtub2RlXTsKIAogICAgICAgICAgICAgICAgICBGT1IoaSwwLDEyKXNlZ3RyZWVbaV1bbm9kZV09YnJbMF1bKGkrZnIpJTEyXTsKIAogICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KIAogICAgZm9yY2VbMipub2RlXT0rZm9yY2Vbbm9kZV07CiAgICBmb3JjZVsyKm5vZGUrMV09K2ZvcmNlW25vZGVdOwogCiAgICBGT1IoaSwwLDEyKQogICAgewogICAgICAgICAgICAgIGJyWzBdW2ldPXNlZ3RyZWVbaV1bMipub2RlXTsKICAgICAgICAgICAgICBiclsxXVtpXT1zZWd0cmVlW2ldWzIqbm9kZSsxXTsKICAgIH0KIAogICAgRk9SKGksMCwxMikKICAgIHsKICAgICAgICAgICAgICBzZWd0cmVlW2ldWzIqbm9kZV09YnJbMF1bKGkrZm9yY2Vbbm9kZV0pJTEyXTsKICAgICAgICAgICAgICBzZWd0cmVlW2ldWzIqbm9kZSsxXT1iclsxXVsoaStmb3JjZVtub2RlXSklMTJdOwogICAgfQogCiAgICBmb3JjZVtub2RlXT0wOwogCiAgICB1cGRhdGUoMipub2RlLGYsKGYrbCkvMix4LHksZnIpOwogICAgdXBkYXRlKDIqbm9kZSsxLCgoZitsKS8yKSsxLGwseCx5LGZyKTsKIAogICAgRk9SKGksMCwxMilzZWd0cmVlW2ldW25vZGVdPW1heChzZWd0cmVlW2ldWzIqbm9kZV0sc2VndHJlZVtpXVsyKm5vZGUrMV0pOwogCiAgICByZXR1cm4gMDsKfQogCmludCBxdWVyeShpbnQgbm9kZSxpbnQgZixpbnQgbCxpbnQgeCxpbnQgeSxpbnQgZmkpCnsKICAgICAgaWYobDx4fHx5PGZ8fGY+bClyZXR1cm4gMDsKICAgICAgZWxzZQogICAgICBpZih4IDw9IGYgJiZsIDw9IHkpCiAgICAgIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlZ3RyZWVbKGZpKSUxMl1bbm9kZV07CiAgICAgIH0KIAogICAgICBmaSs9Zm9yY2Vbbm9kZV07CiAKICAgICAgaW50IHExPXF1ZXJ5KDIqbm9kZSxmLChmK2wpLzIseCx5LGZpKTsKICAgICAgaW50IHEyPXF1ZXJ5KDIqbm9kZSsxLCgoZitsKS8yKSsxLGwseCx5LGZpKTsKIAogICAgICByZXR1cm4gbWF4KHExLHEyKTsKfQogCmludCBtYWluKCkKewogICAgLy9jbG9ja190IHN0YXJ0PWNsb2NrKCk7CiAgICBpbnQgbjsKICAgIHNjYW5mKCIlZCIsJm4pOwogCiAgICBGT1IoaSwxLG4pc2NhbmYoIiVkIiwmYXJbaV0pOwogCiAgICBGT1IoaSwxLG4pCiAgICB7CiAgICAgICAgICAgICAgaW50IHg9YXJbaV07CiAgICAgICAgICAgICAgd2hpbGUoeD4wKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICBkZVtpXS5wYih4JTEwKTsKICAgICAgICAgICAgICAgICAgICAgICB4PSh4LXglMTApLzEwOwogICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgIEZPUih6LDAsMTIpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICBpbnQgeT0wOwogCiAgICAgICAgICAgICAgaW50IHN6PWRlW2ldLnNpemUoKTsKIAogICAgICAgICAgICAgIEZPUkQoaixzei0xLDApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgIHkqPTEwOwogICAgICAgICAgICAgICAgICAgICAgIHkrPWRlW2ldWyhqLXorMTIqc3opJXN6XTsKIAogICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBiclt6XVtpXT15OwogCiAgICAgICAgICAgICAgfQogICAgfQogCiAgICBGT1IoaSwwLDEyKQogICAgewogICAgICAgICAgICAgIGJ1aWxkKGksMSwxLG4pOwogICAgfQogCiAKICAgIGludCBtOwogICAgc2NhbmYoIiVkIiwmbSk7CiAKICAgIHdoaWxlKG0tLSkKICAgIHsKICAgICAgICAgICAgICBpbnQgcXU7CiAgICAgICAgICAgICAgc2NhbmYoIiVkIiwmcXUpOwogCiAgICAgICAgICAgICAgaW50IGwscixmOwogCiAgICAgICAgICAgICAgc2NhbmYoIiVkJWQiLCZsLCZyKTsKIAogICAgICAgICAgICAgIGlmKHF1PT0wKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZmKTsKICAgICAgICAgICAgICAgICB1cGRhdGUoMSwxLG4sbCsxLHIrMSxmJTEyKTsKIAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBwcmludGYoIiVkXG4iLHF1ZXJ5KDEsMSxuLGwrMSxyKzEsMCkpOwogICAgICAgICAgICAgIH0KICAgIH0KIAogICAgIC8vd2hpbGUoY2xvY2soKS1zdGFydDwwLjk1KkNMT0NLU19QRVJfU0VDKTsKICAgIHJldHVybiAwOwp9IAo=