Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- using namespace std;
- #define int long long
- #define pb push_back
- #define mp make_pair
- #pragma GCC optimize("Ofast")
- #pragma GCC optimize("unroll-loops")
- #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
- #pragma GCC target("avx,avx2")
- constexpr int INF = (int)1e9;
- constexpr int N = (int)1e6 + 11;
- constexpr int MAXN = (int)3000 + 11;
- constexpr int md = (int)1e9+7;
- void add(int& a,int b){
- a += b;
- if(a >= md) a -= md;
- }
- int sz(int x){
- int t = 0;
- while(x > 0)
- t++,x/=10;
- return max(0ll,t-1);
- }
- struct node{
- int S[6][6];
- node(){
- for(int i = 0; i < 6; i++){
- for(int j = 0; j < 6; j++){
- S[i][j] = 0;
- }
- }
- }
- node(int x){
- for(int i = 0; i < 6; i++){
- for(int j = 0; j < 6; j++){
- S[i][j] = 0;
- }
- }
- int a = sz(x);
- for(int i = 0; i < 6; i++){
- S[a][i] += x%10;
- x /= 10;
- }
- }
- };
- node t[3*N];
- int a[N];
- node combine(node a,node b){
- node c;
- for(int i = 0; i < 6; i++){
- for(int j = 0; j < 6; j++){
- c.S[i][j] = a.S[i][j] + b.S[i][j];
- }
- }
- return c;
- }
- int getSum(node c){
- int sum = 0;
- int k = 1;
- for(int i = 0; i < 6; i++){
- for(int j = 0; j < 6; j++){
- sum += k * c.S[j][i];
- }
- k *= 10;
- }
- return sum;
- }
- int prom[4*N];
- void doReverse(node& a,int cnt){
- for(int i = 0; i < 6; i++){
- int tt = cnt % (i+1);
- for(int j = 0; j < tt; j++){
- for(int k = 0; k < i; k++){
- swap(a.S[i][k],a.S[i][k+1]);
- }
- }
- }
- return;
- }
- void push(int v){
- doReverse(t[v<<1],prom[v]);
- doReverse(t[v<<1|1],prom[v]);
- prom[v<<1] += prom[v];
- prom[v<<1|1] += prom[v];
- prom[v] = 0;
- return;
- }
- void build(int v,int l,int r){
- if(l > r)
- return;
- if(l == r){
- t[v] = node(a[l]);
- return;
- }
- int m = (l+r)/2;
- build(v<<1,l,m);
- build(v<<1|1,m+1,r);
- t[v] = combine(t[v<<1],t[v<<1|1]);
- return;
- }
- node get(int v,int l,int r,int tl,int tr){
- if(l > r || tl > tr)
- return node(0);
- if(l == tl && r == tr)
- return t[v];
- push(v);
- int m = (l+r)>>1;
- return combine(get(v<<1,l,m,tl,min(tr,m)),get(v<<1|1,m+1,r,max(tl,m+1),tr));
- }
- void upd(int v,int l,int r,int tl,int tr){
- if(l > r || tl > tr)
- return;
- if(l == tl && r == tr){
- doReverse(t[v],1);
- prom[v]++;
- return;
- }
- push(v);
- int m = (l+r)>>1;
- upd(v<<1,l,m,tl,min(tr,m));
- upd(v<<1|1,m+1,r,max(tl,m+1),tr);
- if((v<<1|1) < 3*N)
- t[v] = combine(t[v<<1],t[v<<1|1]);
- else if((v<<1) < 3*N)
- t[v] = t[v<<1];
- return;
- }
- void solve(){
- int n,q;
- cin >> n >> q;
- for(int i = 1; i <= n; i++){
- cin >> a[i];
- }
- build(1,1,n);
- for(int i = 0; i < q; i++){
- int tp,l,r;
- cin >> tp >> l >> r;
- if(tp == 1){
- upd(1,1,n,l,r);
- } else {
- cout << getSum(get(1,1,n,l,r)) << "\n";
- }
- }
- return;
- }
- signed main(){
- ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
- int tests = 1;
- // cin >> tests;
- while(tests--){
- solve();
- }
- }
- /**
- 1 2 6 6 3 4 4 5 5 3 2 1
- NNCB 2 16 CH B HH N CB H NH C HB C HC B HN C NN C BH H NC B NB B BN B BB N BC B CC N CN C
- 2*2*3*5
- MOD = 60
- **/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement