Advertisement
Ne-Biolog

Untitled

Feb 2nd, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. //#include <bits/stdc++.h>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <vector>
  6. #include <cmath>
  7. #include <cstdio>
  8. #include <set>
  9.  
  10. #define DEBUG 1
  11. #define TIME clock() / 1.0 / CLOCKS_PER_SEC
  12.  
  13. using namespace std;
  14.  
  15. const int N = (int)3e5 + 10;
  16.  
  17. int a[N];
  18. int n, m;
  19. int divisors[N];
  20. long long T[4 * N];
  21. set <int> s;
  22.  
  23. template < typename T >
  24. T read(){
  25. T p = 1 , x = 0;
  26. char s = getchar();
  27. while(s == ' ' || s == '\n') s = getchar();
  28. if(s == '-') p = -1 , s = getchar();
  29. while(s >= '0' && s <= '9'){
  30. x = x * 10 + s - '0';
  31. s = getchar();
  32. }
  33. return x * p;
  34. }
  35.  
  36. void update(int v, int l, int r, int pos, int val) {
  37. if(pos < l || pos > r)
  38. return;
  39. if(l == r) {
  40. T[v] = val;
  41. } else {
  42. int m = (l + r) >> 1;
  43. update(v * 2, l, m, pos, val);
  44. update(v * 2 + 1, m + 1, r, pos, val);
  45. T[v] = T[v * 2] + T[v * 2 + 1];
  46. }
  47.  
  48. }
  49.  
  50. long long get_sum(int v, int l, int r, int tl, int tr) {
  51. if(tl > r || tr < l)
  52. return 0;
  53. if(tl >= l && tr <= r)
  54. return T[v];
  55. int tm = (tl + tr) >> 1;
  56. return get_sum(v * 2, l, r, tl, tm) + get_sum(v * 2 + 1, l, r, tm + 1, tr);
  57. }
  58.  
  59. void build(int v, int l, int r) {
  60. if(l == r) {
  61. T[v] = a[r];
  62. } else {
  63. int m = (l + r) >> 1;
  64. build(v * 2, l, m);
  65. build(v * 2 + 1, m + 1, r);
  66. T[v] = T[v * 2] + T[v * 2 + 1];
  67. }
  68. }
  69.  
  70. void get_divisors(int n) {
  71. for(int i = 1; i <= n; ++i) {
  72. for(int j = i; j <= n; j += i)
  73. divisors[j]++;
  74. }
  75. }
  76.  
  77. int main()
  78. {
  79. #if DEBUG
  80. freopen("input.txt", "r", stdin);
  81. freopen("output.txt" , "w", stdout);
  82. ios_base::sync_with_stdio(false);
  83. #endif
  84.  
  85. n = read<int>(), m = read<int>();
  86. get_divisors(n);
  87. for(int i = 1; i <= n; ++i) {
  88. a[i] = read<int>();
  89. int d = divisors[a[i]];
  90. if(a[i] != d) {
  91. s.insert(i);
  92. }
  93. }
  94. build(1, 1, n);
  95.  
  96. for(int i = 0; i < m; ++i) {
  97. int type, l , r;
  98. type = read<int>(), l = read<int>(), r = read<int>();
  99. if(type == 1) {
  100. set <int>:: iterator itl, itr, it;
  101. itl = s.lower_bound(l);
  102. itr = s.upper_bound(r);
  103. vector <int> rem;
  104. for(it = itl; it != itr; ++it) {
  105. int cur = *it;
  106. int curd = divisors[a[cur]], d = a[cur];
  107. update(1, 1, n, cur, curd);
  108. if(curd == d) {
  109. rem.push_back(cur);
  110. } else {
  111. a[cur] = divisors[a[cur]];
  112. }
  113. }
  114. if(rem.size() != 0) {
  115. for(int j = 0; j < rem.size(); ++j) {
  116. s.erase(rem[i]);
  117. }
  118. }
  119.  
  120. } else {
  121. printf("%lld\n", get_sum(1, l, r, 1, n));
  122. }
  123. }
  124.  
  125. return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement