Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <list>
- #include <vector>
- using namespace std;
- void
- build(vector <long long> &t, vector <long long> &a, vector <list <long long>> &g, vector <list <long long>> &x, int i,
- int l, int r) {
- if (l == r) {
- t[i] = a[l];
- if (l != 1) {
- x[1].push_back(i);
- }
- for (auto it = g[l].begin(); it != g[l].end(); ++it) {
- x[*it].push_back(i);
- }
- } else {
- int m = (l + r - 1) / 2;
- build(t, a, g, x, i * 2, l, m);
- build(t, a, g, x, i * 2 + 1, m + 1, r);
- }
- }
- void update(vector <long long> &t, int i, int l, int r, int l0, int r0, long long d) {
- if (l0 <= r0) {
- if (l == l0 && r == r0) {
- t[i] += d;
- } else {
- update(t, i * 2, l, (l + r - 1) / 2, l0, min(r0, (l + r - 1) / 2), d);
- update(t, i * 2 + 1, (l + r - 1) / 2 + 1, r, max(l0, (l + r - 1) / 2 + 1), r0, d);
- }
- }
- }
- long long get(vector <long long> &t, int i, int l, int r, int pos) {
- if (l == r) {
- return t[pos];
- }
- if (i <= (r + l - 1) / 2) {
- return t[pos] + get(t, i, l, (r + l - 1) / 2, pos * 2);
- } else {
- return t[pos] + get(t, i, ((r + l - 1) / 2) + 1, r, pos * 2 + 1);
- }
- }
- int pow2(int n) {
- int res = 1;
- while (res < n) {
- res *= 2;
- }
- return res;
- }
- void print(vector <long long> &t, int n) {
- cout << "a: ";
- for (int k = 1; k != n + 1; ++k) {
- cout << get(t, k, 1, n, 1) << " ";
- }
- cout << "\n";
- }
- int main() {
- /* // для быстрого ввода
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- */
- int n; // количество частиц
- //cin >> n;
- scanf("%d", &n);
- vector <long long> a(n + 1); // начальные заряды частиц
- for (int i = 1; i != n + 1; ++i) {
- //cin >> a[i];
- scanf("%d", &a[i]);
- }
- vector <list <long long>> g(n + 1, list <long long>());
- for (int i = 2; i * i < n + 1; ++i) {
- for (int j = i; j * i < n + 1; ++j) {
- g[i * j].push_front(j);
- if (i != j) {
- g[i * j].push_front(i);
- }
- }
- }
- vector <list <long long>> x(n + 1, list <long long>());
- vector <long long> t(pow2(n));
- build(t, a, g, x, 1, 1, n);
- // print(t, n);
- int q; // количество запросов
- cin >> q;
- int q0; // запрос
- int i; // номер частицы
- int l, r; // границы отрезка
- long long d; // мощность
- for (int k = 0; k != q; ++k) {
- //cin >> q0;
- scanf("%d", &q0);
- if (q0 == 1) {
- //cin >> i;
- scanf("%d", &i);
- //cout << get(t, i, 1, n, 1) << "\n";
- printf("%d\n", get(t,i,1,n, 1));
- } else if (q0 == 2) {
- //cin >> l >> r >> d;
- scanf("%d%d%d", &l, &r, &d);
- update(t, 1, 1, n, l, r, d);
- for (int j = l; j != r + 1; ++j) {
- for (auto it = x[j].begin(); it != x[j].end(); ++it) {
- t[*it] += d;
- }
- }
- // print(t, n); ВЫВОД МАССИВА ПОСЛЕ ПРИБАВЛЕНИЯ ЧИСЛА d
- }
- }
- // ХЕРНЯ ДЛЯ СЕБЯ
- /*
- for (size_t i = 1; i != n; ++i) {
- cout << i << ": ";
- for (auto it = x[i].begin(); it != x[i].end(); ++it) {
- cout << "*it = " << *it << " t[" << *it << "] = " << t[*it] << "\n";
- }
- cout << "\n";
- }
- */
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement