fork download
  1. // ~~ icebear ~~
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7. typedef pair<int, ii> iii;
  8.  
  9. template<class T>
  10. bool minimize(T &a, const T &b) {
  11. if (a > b) return a = b, true;
  12. return false;
  13. }
  14.  
  15. template<class T>
  16. bool maximize(T &a, const T &b) {
  17. if (a < b) return a = b, true;
  18. return false;
  19. }
  20.  
  21. #define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
  22. #define FORR(i,a,b) for(int i=(a); i>=(b); --i)
  23. #define REP(i, n) for(int i=0; i<(n); ++i)
  24. #define RED(i, n) for(int i=(n)-1; i>=0; --i)
  25. #define MASK(i) (1LL << (i))
  26. #define BIT(S, i) (((S) >> (i)) & 1)
  27. #define mp make_pair
  28. #define pb push_back
  29. #define fi first
  30. #define se second
  31. #define all(x) x.begin(), x.end()
  32. #define task "csch"
  33.  
  34. const int MOD = 1e9 + 7;
  35. const int inf = 1e9 + 27092008;
  36. const ll INF = 1e18 + 27092008;
  37. const int N = 1e5 + 5;
  38. const int S = 20;
  39. struct Query {
  40. int l, r, id;
  41. bool operator < (const Query &other) const {
  42. if (l / S != other.l / S) return l < other.l;
  43. return ((l / S) & 1 ? r > other.r : r < other.r);
  44. }
  45. } Q[N];
  46.  
  47. struct Event {
  48. int l, r, id, sign;
  49. Event(int _l = 0, int _r = 0, int _id = 0, int _sign = 0):
  50. l(_l), r(_r), id(_id), sign(_sign) {}
  51. };
  52. vector<Event> E[N];
  53.  
  54. int n, q, a[N], last_id[N];
  55. ll ans_prev[N], ans_there[N], ans[N];
  56. vector<int> divs[N];
  57.  
  58. void init(void) {
  59. cin >> n >> q;
  60. FOR(i, 1, n) cin >> a[i];
  61. FOR(i, 1, q) cin >> Q[i].l >> Q[i].r, Q[i].id = i;
  62. FOR(i, 1, N - 5) for(int j = i; j < N; j += i)
  63. divs[j].pb(i);
  64. }
  65.  
  66. void process(void) {
  67. sort(Q + 1, Q + q + 1);
  68. int L = 1, R = 0, last = 0;
  69. FOR(i, 1, q) {
  70. last_id[i] = last;
  71. last = Q[i].id;
  72. int l = Q[i].l, r = Q[i].r;
  73. if (L > r || R < l) {
  74. E[r].emplace_back(l, r - 1, Q[i].id, +1);
  75. L = l;
  76. R = r;
  77. last_id[i] = 0;
  78. continue;
  79. }
  80.  
  81. if (L > l) E[R].emplace_back(l, L - 1, Q[i].id, +1);
  82. if (L < l) E[R].emplace_back(L, l - 1, Q[i].id, -1);
  83. L = l;
  84.  
  85. if (R < r) E[L - 1].emplace_back(R + 1, r, Q[i].id, +1);
  86. if (R > r) E[L - 1].emplace_back(r + 1, R, Q[i].id, -1);
  87. R = r;
  88. }
  89.  
  90. /*
  91.   contribution of [x, y] to [u, v] : G(x, y, u, v)
  92.   1. [l, r] -> [l', r]
  93.   = G(l-1, l-1, l, r) + G(l-2, l-2, l-1, r) + ... + G(l', l', l'+1, r)
  94.   = G(l', l, 1, r) - (G(l', l', 1, l') + G(l'+1, l'+1, 1, l'+1) + ... G(l, l, 1, l))
  95.   = G(l', l, 1, r) - (ans_there[l] - ans_there[l'-1])
  96.  
  97.   2. [l, r] -> [l, r']
  98.   = G(r+1, r+1, l, r) + G(r+2, r+2, l, r+1) + ... + G(r', r', l, r'-1)
  99.   = G(r+1, r+1, 1, r) + G(r+2, r+2, 1, r+1) + ... + G(r', r', 1, r'-1) - G(r, r', 1, l-1)
  100.   = (ans_prev[r'] - ans_prev[r-1]) - G(1, l-1, r, r')
  101.   */
  102.  
  103. vector<int> div_cnt(N, 0), mul_cnt(N, 0), freq(N, 0);
  104. FOR(i, 1, n) {
  105. ans_prev[i] = ans_prev[i - 1] + div_cnt[a[i]];
  106. for(int &d : divs[a[i]]) ans_prev[i] += freq[d];
  107. for(int &d : divs[a[i]]) div_cnt[d]++;
  108. freq[a[i]]++;
  109.  
  110. ans_there[i] = ans_there[i - 1] + div_cnt[a[i]];
  111. for(int &d : divs[a[i]]) ans_there[i] += freq[d];
  112.  
  113. if (a[i] >= S) {
  114. for(int x = a[i]; x < N; x += a[i])
  115. mul_cnt[x]++;
  116. }
  117.  
  118. for(auto &e : E[i]) {
  119. if (e.r <= i) {
  120. // Case 1
  121. FOR(j, e.l, e.r)
  122. ans[e.id] += e.sign * (div_cnt[a[j]] + mul_cnt[a[j]]);
  123. } else {
  124. // Case 2
  125. FOR(j, e.l, e.r)
  126. ans[e.id] -= e.sign * (div_cnt[a[j]] + mul_cnt[a[j]]);
  127. }
  128. }
  129. }
  130.  
  131. FOR(d, 1, S - 1) {
  132. vector<int> pref(n+5, 0);
  133. FOR(i, 1, n) pref[i] = (a[i] == d);
  134.  
  135. partial_sum(all(pref), pref.begin());
  136. vector<ll> pref2(n+5, 0);
  137. FOR(i, 1, n) if (a[i] % d == 0)
  138. pref2[i] = 1;
  139. partial_sum(all(pref2), pref2.begin());
  140.  
  141. FOR(i, 1, n) for(auto &e : E[i]) {
  142. if (e.r <= i) {
  143. ans[e.id] += e.sign * (pref2[e.r] - pref2[e.l - 1]) * pref[i];
  144. } else {
  145. ans[e.id] -= e.sign * (pref2[e.r] - pref2[e.l - 1]) * pref[i];
  146. }
  147. }
  148. }
  149.  
  150. FOR(i, 0, n) for(auto &e : E[i]) {
  151. if (e.r <= i) {
  152. // Case 1
  153. ans[e.id] -= e.sign * (ans_there[e.r] - ans_there[e.l - 1]);
  154. } else {
  155. // Case 2
  156. ans[e.id] += e.sign * (ans_prev[e.r] - ans_prev[e.l - 1]);
  157. }
  158. }
  159.  
  160. FOR(i, 1, q) ans[Q[i].id] += ans[last_id[i]];
  161. FOR(i, 1, q) ans[Q[i].id] += Q[i].r - Q[i].l + 1;
  162. FOR(i, 1, q) cout << ans[i] << '\n';
  163. }
  164.  
  165. int main() {
  166. ios_base::sync_with_stdio(0);
  167. cin.tie(0); cout.tie(0);
  168. if (fopen(task".inp", "r")) {
  169. freopen(task".inp", "r", stdin);
  170. freopen(task".out", "w", stdout);
  171. }
  172. int tc = 1;
  173. // cin >> tc;
  174. while(tc--) {
  175. init();
  176. process();
  177. }
  178. return 0;
  179. }
Success #stdin #stdout 0.07s 18108KB
stdin
Standard input is empty
stdout
Standard output is empty