Advertisement
Guest User

update

a guest
May 21st, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.06 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <list>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. void
  9. build(vector <long long> &t, vector <long long> &a, vector <list <long long>> &g, vector <list <long long>> &x, int i,
  10.       int l, int r) {
  11.     if (l == r) {
  12.         t[i] = a[l];
  13.         if (l != 1) {
  14.             x[1].push_back(i);
  15.         }
  16.         for (auto it = g[l].begin(); it != g[l].end(); ++it) {
  17.             x[*it].push_back(i);
  18.         }
  19.  
  20.     } else {
  21.         int m = (l + r - 1) / 2;
  22.         build(t, a, g, x, i * 2, l, m);
  23.         build(t, a, g, x, i * 2 + 1, m + 1, r);
  24.     }
  25. }
  26.  
  27. void update(vector <long long> &t, int i, int l, int r, int l0, int r0, long long d) {
  28.     if (l0 <= r0) {
  29.         if (l == l0 && r == r0) {
  30.             t[i] += d;
  31.         } else {
  32.             update(t, i * 2, l, (l + r - 1) / 2, l0, min(r0, (l + r - 1) / 2), d);
  33.             update(t, i * 2 + 1, (l + r - 1) / 2 + 1, r, max(l0, (l + r - 1) / 2 + 1), r0, d);
  34.         }
  35.     }
  36. }
  37.  
  38. long long get(vector <long long> &t, int i, int l, int r, int pos) {
  39.     if (l == r) {
  40.         return t[pos];
  41.     }
  42.     if (i <= (r + l - 1) / 2) {
  43.         return t[pos] + get(t, i, l, (r + l - 1) / 2, pos * 2);
  44.     } else {
  45.         return t[pos] + get(t, i, ((r + l - 1) / 2) + 1, r, pos * 2 + 1);
  46.     }
  47. }
  48.  
  49. int pow2(int n) {
  50.     int res = 1;
  51.     while (res < n) {
  52.         res *= 2;
  53.     }
  54.     return res;
  55. }
  56.  
  57. void print(vector <long long> &t, int n) {
  58.     cout << "a: ";
  59.     for (int k = 1; k != n + 1; ++k) {
  60.         cout << get(t, k, 1, n, 1) << " ";
  61.     }
  62.     cout << "\n";
  63. }
  64.  
  65. int main() {
  66.  
  67.     /*                                                       // для быстрого ввода
  68.     ios_base::sync_with_stdio(false);
  69.     cin.tie(NULL);
  70.     */
  71.  
  72.  
  73.     int n;                                                 // количество частиц
  74.     //cin >> n;
  75.     scanf("%d", &n);
  76.     vector <long long> a(n + 1);                                  // начальные заряды частиц
  77.     for (int i = 1; i != n + 1; ++i) {
  78.         //cin >> a[i];
  79.         scanf("%d", &a[i]);
  80.     }
  81.  
  82.     vector <list <long long>> g(n + 1, list <long long>());
  83.     for (int i = 2; i * i < n + 1; ++i) {
  84.         for (int j = i; j * i < n + 1; ++j) {
  85.             g[i * j].push_front(j);
  86.             if (i != j) {
  87.                 g[i * j].push_front(i);
  88.             }
  89.         }
  90.     }
  91.  
  92.     vector <list <long long>> x(n + 1, list <long long>());
  93.  
  94.     vector <long long> t(pow2(n));
  95.     build(t, a, g, x, 1, 1, n);
  96.  
  97.     // print(t, n);
  98.  
  99.     int q;                                                  // количество запросов
  100.     cin >> q;
  101.     int q0;                                                 // запрос
  102.     int i;                                                  // номер частицы
  103.     int l, r;                                               // границы отрезка
  104.     long long d;                                                 // мощность
  105.     for (int k = 0; k != q; ++k) {
  106.         //cin >> q0;
  107.         scanf("%d", &q0);
  108.         if (q0 == 1) {
  109.             //cin >> i;
  110.             scanf("%d", &i);
  111.             //cout << get(t, i, 1, n, 1) << "\n";
  112.             printf("%d\n", get(t,i,1,n, 1));
  113.         } else if (q0 == 2) {
  114.             //cin >> l >> r >> d;
  115.             scanf("%d%d%d", &l, &r, &d);
  116.             update(t, 1, 1, n, l, r, d);
  117.             for (int j = l; j != r + 1; ++j) {
  118.                 for (auto it = x[j].begin(); it != x[j].end(); ++it) {
  119.                     t[*it] += d;
  120.                 }
  121.             }
  122.             // print(t, n);                                          ВЫВОД МАССИВА ПОСЛЕ ПРИБАВЛЕНИЯ ЧИСЛА d
  123.         }
  124.     }
  125.  
  126.  
  127.  
  128.     // ХЕРНЯ ДЛЯ СЕБЯ
  129.     /*
  130.     for (size_t i = 1; i != n; ++i) {
  131.         cout << i << ": ";
  132.         for (auto it = x[i].begin(); it != x[i].end(); ++it) {
  133.             cout << "*it = " << *it << " t[" << *it << "] = " << t[*it] << "\n";
  134.         }
  135.         cout << "\n";
  136.     }
  137.     */
  138.  
  139.     return 0;
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement