fork download
  1. /*
  2. * Author: Geeza
  3. */
  4.  
  5. #include <bits/stdc++.h>
  6.  
  7. #define ld long double
  8. #define ll long long
  9. #define pb push_back
  10. #define fin(a, n) for(int i = a; i < n; i++)
  11. #define fjn(a, n) for(int j = a; j < n; j++)
  12. #define all(a) a.begin(),a.end()
  13. #define allr(a) a.rbegin(),a.rend()
  14. #define FAST ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
  15.  
  16. using namespace std;
  17.  
  18. const double PI = acos(-1);
  19. const int N = 2e5+5;
  20. const ll oo = 0x3f3f3f3f3f3f3f3f;
  21. const int mod = 1000000007, inf = 1e6;
  22.  
  23. string di[] = {"D","L", "U", "R", "UL", "UR", "DL", "DR"};
  24. int dx[] = {+1, +0, +0, -1, -1, -1, +1, +1};
  25. int dy[] = {+0, -1, +1, +0, -1, +1, -1, +1};
  26. char dc[] = {'D', 'L', 'R', 'U'};
  27.  
  28. struct node {
  29. ll cnt;
  30. node():cnt(0) {}
  31. node(ll x): cnt(x) {}
  32. void add(ll x) {
  33. cnt += x;
  34. }
  35. };
  36.  
  37. struct segTree {
  38. ll treeSize;
  39. vector<node> tree;
  40.  
  41. segTree(ll n) {
  42. treeSize = 1;
  43. while (treeSize < n) treeSize <<= 1;
  44. tree.resize(2 * treeSize, node());
  45. }
  46.  
  47. node merge(node l, node r) {
  48. node parent = node();
  49. parent.cnt = l.cnt + r.cnt;
  50. return parent;
  51. }
  52.  
  53. void update(ll idx, ll val, ll i, ll l, ll r) {
  54. if (r - l == 1) {
  55. tree[i].add(val);
  56. return;
  57. }
  58.  
  59. ll mid = (l+r)/2;
  60. if (idx < mid) update(idx, val, 2*i+1, l, mid);
  61. else update(idx, val, 2*i+2, mid, r);
  62. tree[i] = merge(tree[2*i+1], tree[2*i+2]);
  63. }
  64.  
  65. void update(ll idx, ll val) {
  66. update(idx, val, 0, 0, treeSize);
  67. }
  68.  
  69. node query(ll l, ll r, ll n, ll lx, ll rx) {
  70. if (lx >= r || rx <= l) return node();
  71. if (lx >= l && rx <= r) return tree[n];
  72.  
  73. ll mid = lx + (rx - lx) / 2;
  74. node lf = query(l, r, 2*n+1, lx, mid);
  75. node ri = query(l, r, 2*n+2, mid, rx);
  76. return merge(lf, ri);
  77. }
  78.  
  79. ll query(ll l, ll r) {
  80. return query(l, r, 0, 0, treeSize).cnt;
  81. }
  82. };
  83.  
  84. ll n, q;
  85. vector<ll> divs;
  86.  
  87. void precompute() {
  88. divs.assign(N, 0);
  89. for (ll i = 1; i <= n; i++) {
  90. for (ll j = i; j <= n; j+=i) divs[j]++;
  91. }
  92. }
  93.  
  94. void solve() {
  95. vector<ll> v(n);
  96. fin(0, n) cin >> v[i];
  97.  
  98. vector<array<ll, 3>> queries(q);
  99. fin(0, q) {
  100. cin >> queries[i][0] >> queries[i][1];
  101. queries[i][0]--, queries[i][1]--, queries[i][2] = i;
  102. }
  103.  
  104. sort(all(queries), [&](array<ll ,3> &a, array<ll, 3> &b) {
  105. if (a[1] == b[1]) return a[0] < b[0];
  106. return a[1] < b[1];
  107. });
  108.  
  109. // for (auto [x, y] : queries) cout << x << " " << y << "\n";
  110. segTree st(n);
  111. vector<ll> ans(q);
  112. vector<bool> added(n, false);
  113. for (auto vec : queries) {
  114. ll l = vec[0], r = vec[1], idx = vec[2];
  115. for (int x = l; x <= r; x++) {
  116. if (added[x]) continue;
  117. st.update(x, divs[v[x]]);
  118. added[x] = true;
  119. }
  120. ans[idx] = st.query(l, r+1);
  121. }
  122.  
  123. for (auto x : ans) cout << x << "\n";
  124. }
  125.  
  126. int main() {
  127. #ifndef ONLINE_JUDGE
  128. freopen("input.txt","r",stdin);
  129. freopen("output.txt","w",stdout);
  130. #endif
  131. int tt = 1; //cin >> tt;
  132. while(tt--){
  133. cin >> n >> q;
  134. precompute();
  135. solve();
  136. }
  137. return 0;
  138. }
Success #stdin #stdout 0s 5328KB
stdin
Standard input is empty
stdout
Standard output is empty