Advertisement
Guest User

Untitled

a guest
May 25th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.04 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int maxn = 1000090;
  5.  
  6. int t[1000090],b[1000090][10],l1[1000090];
  7.  
  8. void recalc(int v){
  9. int h=l1[v]%10;
  10. if (v*2<maxn) l1[v*2]+=l1[v];
  11. if (v*2+1<maxn) l1[v*2+1]+=l1[v];
  12. l1[v]=0;
  13. if(h==0)return;
  14. t[v]=0;
  15. int newB[10];
  16. for(int i=0;i<10;i++){
  17. newB[(i+h)%10]=b[v][i];
  18. }
  19. for(int i=0;i<10;i++){
  20. b[v][i]=newB[i];
  21. t[v]+=(b[v][i]*i);
  22. }
  23. }
  24.  
  25. void build (vector<int> &a, int v, int tl, int tr) {
  26. if (tl == tr){
  27. t[v]=a[tl];
  28. b[v][a[tl]]=1;
  29. }
  30. else {
  31. int tm = (tl + tr) / 2;
  32. build (a, v*2, tl, tm);
  33. build (a, v*2+1, tm+1, tr);
  34. t[v] = t[v*2] + t[v*2+1];
  35. for(int i=0;i<10;i++)b[v][i] = b[v*2][i] + b[v*2+1][i];
  36. }
  37. }
  38. void update(int v, int tl, int tr, int l, int r){
  39. recalc(v);
  40. if (l > r)
  41. return;
  42. if (l == tl && r == tr){
  43. l1[v]+=1;
  44. recalc(v);
  45. return;
  46. }
  47. if(l1[v]>0)recalc(v);
  48. int tm = (tl + tr) / 2;
  49. update(v*2, tl, tm, l, min(r,tm));
  50. update(v*2+1, tm+1, tr, max(l,tm+1), r);
  51. t[v] = t[v*2] + t[v*2+1];
  52. for(int i=0;i<10;i++)b[v][i] = b[v*2][i] + b[v*2+1][i];
  53. return;
  54. }
  55.  
  56. int sum (int v, int tl, int tr, int l, int r) {
  57. recalc(v);
  58. if (l > r)
  59. return 0;
  60. if (l == tl && r == tr){
  61. recalc(v);
  62. return t[v];
  63. }
  64. recalc(v);
  65. int tm = (tl + tr) / 2;
  66. return sum (v*2, tl, tm, l, min(r,tm))
  67. + sum (v*2+1, tm+1, tr, max(l,tm+1), r);
  68. }
  69.  
  70. int main() {
  71. for(int i=0;i<1000090;i++)l1[i]=0;
  72. int n,m;
  73. cin>>n>>m;
  74. char c;
  75. vector<int> a(n);
  76. for(int i=0;i<n;i++){
  77. cin>>c;
  78. a[i]=(int)c-48;
  79. }
  80. build(a,1,0,n-1);
  81. int l,r;
  82. for(int i=0;i<m;i++){
  83. cin>>l>>r;
  84. int ans = sum(1,0,n-1,l-1,r-1);
  85. cout << ans << '\n';
  86. update(1,0,n-1,l-1,r-1);
  87. for (int i = 0; i<n; i++){
  88. cout << sum(1, 0, n-1, i, i) << " ";
  89. }
  90. }
  91. return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement