Advertisement
welleyth

D. Rotations

Mar 17th, 2022
1,074
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.67 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace __gnu_pbds;
  5. using namespace std;
  6. #define int long long
  7. #define pb push_back
  8. #define mp make_pair
  9.  
  10. #pragma GCC optimize("Ofast")
  11. #pragma GCC optimize("unroll-loops")
  12. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
  13. #pragma GCC target("avx,avx2")
  14.  
  15. constexpr int INF = (int)1e9;
  16. constexpr int N = (int)1e6 + 11;
  17. constexpr int MAXN = (int)3000 + 11;
  18. constexpr int md = (int)1e9+7;
  19.  
  20. void add(int& a,int b){
  21.     a += b;
  22.     if(a >= md) a -= md;
  23. }
  24. int sz(int x){
  25.     int t = 0;
  26.     while(x > 0)
  27.         t++,x/=10;
  28.     return max(0ll,t-1);
  29. }
  30. struct node{
  31.     int S[6][6];
  32.     node(){
  33.         for(int i = 0; i < 6; i++){
  34.             for(int j = 0; j < 6; j++){
  35.                 S[i][j] = 0;
  36.             }
  37.         }
  38.     }
  39.     node(int x){
  40.         for(int i = 0; i < 6; i++){
  41.             for(int j = 0; j < 6; j++){
  42.                 S[i][j] = 0;
  43.             }
  44.         }
  45.         int a = sz(x);
  46.         for(int i = 0; i < 6; i++){
  47.             S[a][i] += x%10;
  48.             x /= 10;
  49.         }
  50.     }
  51. };
  52.  
  53. node t[3*N];
  54. int a[N];
  55. node combine(node a,node b){
  56.     node c;
  57.     for(int i = 0; i < 6; i++){
  58.         for(int j = 0; j < 6; j++){
  59.             c.S[i][j] = a.S[i][j] + b.S[i][j];
  60.         }
  61.     }
  62.     return c;
  63. }
  64. int getSum(node c){
  65.     int sum = 0;
  66.     int k = 1;
  67.     for(int i = 0; i < 6; i++){
  68.         for(int j = 0; j < 6; j++){
  69.             sum += k * c.S[j][i];
  70.         }
  71.         k *= 10;
  72.     }
  73.     return sum;
  74. }
  75. int prom[4*N];
  76. void doReverse(node& a,int cnt){
  77.     for(int i = 0; i < 6; i++){
  78.         int tt = cnt % (i+1);
  79.         for(int j = 0; j < tt; j++){
  80.             for(int k = 0; k < i; k++){
  81.                 swap(a.S[i][k],a.S[i][k+1]);
  82.             }
  83.         }
  84.     }
  85.     return;
  86. }
  87. void push(int v){
  88.     doReverse(t[v<<1],prom[v]);
  89.     doReverse(t[v<<1|1],prom[v]);
  90.     prom[v<<1] += prom[v];
  91.     prom[v<<1|1] += prom[v];
  92.     prom[v] = 0;
  93.     return;
  94. }
  95. void build(int v,int l,int r){
  96.     if(l > r)
  97.         return;
  98.     if(l == r){
  99.         t[v] = node(a[l]);
  100.         return;
  101.     }
  102.     int m = (l+r)/2;
  103.     build(v<<1,l,m);
  104.     build(v<<1|1,m+1,r);
  105.     t[v] = combine(t[v<<1],t[v<<1|1]);
  106.     return;
  107. }
  108.  
  109. node get(int v,int l,int r,int tl,int tr){
  110.     if(l > r || tl > tr)
  111.         return node(0);
  112.     if(l == tl && r == tr)
  113.         return t[v];
  114.     push(v);
  115.     int m = (l+r)>>1;
  116.     return combine(get(v<<1,l,m,tl,min(tr,m)),get(v<<1|1,m+1,r,max(tl,m+1),tr));
  117. }
  118. void upd(int v,int l,int r,int tl,int tr){
  119.     if(l > r || tl > tr)
  120.         return;
  121.     if(l == tl && r == tr){
  122.         doReverse(t[v],1);
  123.         prom[v]++;
  124.         return;
  125.     }
  126.     push(v);
  127.     int m = (l+r)>>1;
  128.     upd(v<<1,l,m,tl,min(tr,m));
  129.     upd(v<<1|1,m+1,r,max(tl,m+1),tr);
  130.     if((v<<1|1) < 3*N)
  131.         t[v] = combine(t[v<<1],t[v<<1|1]);
  132.     else if((v<<1) < 3*N)
  133.         t[v] = t[v<<1];
  134.     return;
  135. }
  136.  
  137. void solve(){
  138.     int n,q;
  139.     cin >> n >> q;
  140.  
  141.     for(int i = 1; i <= n; i++){
  142.         cin >> a[i];
  143.     }
  144.  
  145.     build(1,1,n);
  146.  
  147.     for(int i = 0; i < q; i++){
  148.         int tp,l,r;
  149.         cin >> tp >> l >> r;
  150.         if(tp == 1){
  151.             upd(1,1,n,l,r);
  152.         } else {
  153.             cout << getSum(get(1,1,n,l,r)) << "\n";
  154.         }
  155.     }
  156.  
  157.     return;
  158. }
  159. signed main(){
  160.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  161.     int tests = 1;
  162. //      cin >> tests;
  163.     while(tests--){
  164.         solve();
  165.     }
  166. }
  167. /**
  168. 1 2 6 6 3 4 4 5 5 3 2 1
  169. 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
  170. 2*2*3*5
  171.  
  172. MOD = 60
  173.  
  174. **/
  175.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement