Guest User

Untitled

a guest
Aug 31st, 2015
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.39 KB | None | 0 0
  1. // Smile please :)
  2.  
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <cmath>
  7. #include <ctime>
  8. #include <cassert>
  9. #include <cctype>
  10. #include <sstream>
  11. #include <iostream>
  12. #include <algorithm>
  13. #include <string>
  14. #include <iomanip>
  15. #include <numeric>
  16. #include <vector>
  17. #include <queue>
  18. #include <stack>
  19. #include <deque>
  20. #include <set>
  21. #include <map>
  22. #include <list>
  23. #include <bitset>
  24. #include <climits>
  25. //#include <unordered_map>
  26. //#include <unordered_set>
  27. using namespace std;
  28.  
  29. //#undef KVARK_DEBUG
  30.  
  31. #ifdef KVARK_DEBUG
  32.     #include "../h/debug.h"
  33. #else
  34. #define dbg(...) (void(1));
  35. #define dbg2(...) (void(1));
  36. #define dbg3(...) (void(1));
  37. #define dbg4(...) (void(1));
  38. #define dbg5(...) (void(1));
  39. #define dbgp(...) (void(1));
  40. #define dbg_arr(...) (void(1));
  41. #define dbg_vec(...) (void(1));
  42. #endif
  43.  
  44. typedef pair<int, int> pii;
  45. typedef pair<long long, long long> pll;
  46. typedef pair<double, int> pdl;
  47. typedef vector<int> vi;
  48. typedef vector<pii> vpii;
  49. typedef vector<pll> vpll;
  50. typedef vector<vector<int> > vvi;
  51. typedef vector<vector<pii> > vvpii;
  52. typedef vector<vector<long long> > vvll;
  53. typedef vector<long long> vll;
  54. typedef long long int llint;
  55.  
  56. #define ALL(v) (v.begin()), (v.end())
  57. #define SZ(v) ((int)((v).size()))
  58. #define endl "\n"
  59.  
  60. void task();
  61.  
  62. int main(){
  63. #ifdef KVARK
  64.     freopen("input.txt", "r", stdin);
  65.     //freopen("output.txt", "w", stdout);
  66. #else
  67.     //freopen("input.txt", "r", stdin);
  68.     //freopen("output.txt", "w", stdout);
  69.     srand(time(0));
  70. #endif
  71.     ios_base::sync_with_stdio(0);
  72.  
  73.     task();
  74.  
  75. #ifdef KVARK_DEBUG
  76.     my_debug::printProcessInfo();
  77. #endif
  78.     return 0;
  79. }
  80.  
  81. int n;
  82. llint a[int(1e5)+10];
  83. llint add[int(1e5)+10];
  84. const int M = 1000;
  85.  
  86. struct SegTree {
  87.     vll sum;
  88.     vll add;
  89.     SegTree() {
  90.         sum.resize(4e5+10, 0);
  91.         add = sum;
  92.     }
  93.  
  94.     void push(int v, int l, int r) {
  95.         if (2 * v + 1 < SZ(sum)) {
  96.             add[2*v]   += add[v];
  97.             add[2*v+1] += add[v];
  98.         }
  99.         sum[v] += add[v] * (r - l + 1);
  100.         add[v] = 0;
  101.     }
  102.  
  103.     llint get(int v, int tl, int tr, int l, int r) {
  104.         if (tl > tr || l > r)
  105.             return 0;
  106.         push(v, tl, tr);
  107.         if (tl == l && tr == r)
  108.             return sum[v] + add[v] * (tr - tl + 1);
  109.         int mid = (tl + tr) / 2;
  110.         return get(2 * v, tl, mid, l, min(mid, r)) +
  111.                      get(2 * v + 1, mid + 1, tr, max(l, mid + 1), r);
  112.     }
  113.  
  114.     void add_val(int v, int tl, int tr, int l, int r, int val) {
  115.         if (tl > tr || l > r)
  116.             return;
  117.         push(v, tl, tr);
  118.         if (tl == l && tr == r) {
  119.             add[v] += val;
  120.             return;
  121.         }
  122.         int mid = (tl + tr) / 2;
  123.         add_val(2 * v, tl, mid, l, min(mid, r), val);
  124.         add_val(2 * v + 1, mid + 1, tr, max(l, mid + 1), r, val);
  125.         sum[v] = sum[2*v] + sum[2*v+1] + add[2*v] * (mid - tl + 1) + add[2*v+1] * (tr - mid);
  126.     }
  127.  
  128. } t;
  129.  
  130. void task(){
  131.     cin >> n;
  132.     for (int i = 0; i < n; ++i) {
  133.         cin >> a[i];
  134.         t.add_val(1, 0, n-1, i, i, a[i]);
  135.     }
  136.     int q;
  137.     cin >> q;
  138.     llint asdasd = 0;
  139.     while (q--) {
  140.         int b, l, r;
  141.         int c;
  142.         int d;
  143.         cin >> b;
  144.         if (b == 1) {
  145.             cin >> l >> r >> c;
  146.             --l, --r;
  147.             t.add_val(1, 0, n-1, l, r, c);
  148.         }
  149.         if (b == 2) {
  150.             cin >> d >> c;
  151.             if (d < M) {
  152.                 add[d] += c;
  153.             } else {
  154.                 for (int i = d - 1; i < n; i += d)
  155.                     t.add_val(1, 0, n-1, i, i, c);
  156.             }
  157.         }
  158.         if (b == 3) {
  159.             cin >> l >> r;
  160.             --l, --r;
  161.             llint ans = t.get(1, 0, n-1, l, r);
  162.             ++r;
  163.             for (int j = 1; j < M; ++j)
  164.                 ans += (r / j - l / j) * add[j];
  165.             cout << ans << "\n";
  166.             fflush(stdout);
  167.         }
  168.     }
  169. }
Advertisement
Add Comment
Please, Sign In to add comment