Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Smile please :)
- #include <cstdio>
- #include <cstring>
- #include <cstdlib>
- #include <cmath>
- #include <ctime>
- #include <cassert>
- #include <cctype>
- #include <sstream>
- #include <iostream>
- #include <algorithm>
- #include <string>
- #include <iomanip>
- #include <numeric>
- #include <vector>
- #include <queue>
- #include <stack>
- #include <deque>
- #include <set>
- #include <map>
- #include <list>
- #include <bitset>
- #include <climits>
- //#include <unordered_map>
- //#include <unordered_set>
- using namespace std;
- //#undef KVARK_DEBUG
- #ifdef KVARK_DEBUG
- #include "../h/debug.h"
- #else
- #define dbg(...) (void(1));
- #define dbg2(...) (void(1));
- #define dbg3(...) (void(1));
- #define dbg4(...) (void(1));
- #define dbg5(...) (void(1));
- #define dbgp(...) (void(1));
- #define dbg_arr(...) (void(1));
- #define dbg_vec(...) (void(1));
- #endif
- typedef pair<int, int> pii;
- typedef pair<long long, long long> pll;
- typedef pair<double, int> pdl;
- typedef vector<int> vi;
- typedef vector<pii> vpii;
- typedef vector<pll> vpll;
- typedef vector<vector<int> > vvi;
- typedef vector<vector<pii> > vvpii;
- typedef vector<vector<long long> > vvll;
- typedef vector<long long> vll;
- typedef long long int llint;
- #define ALL(v) (v.begin()), (v.end())
- #define SZ(v) ((int)((v).size()))
- #define endl "\n"
- void task();
- int main(){
- #ifdef KVARK
- freopen("input.txt", "r", stdin);
- //freopen("output.txt", "w", stdout);
- #else
- //freopen("input.txt", "r", stdin);
- //freopen("output.txt", "w", stdout);
- srand(time(0));
- #endif
- ios_base::sync_with_stdio(0);
- task();
- #ifdef KVARK_DEBUG
- my_debug::printProcessInfo();
- #endif
- return 0;
- }
- int n;
- llint a[int(1e5)+10];
- llint add[int(1e5)+10];
- const int M = 1000;
- struct SegTree {
- vll sum;
- vll add;
- SegTree() {
- sum.resize(4e5+10, 0);
- add = sum;
- }
- void push(int v, int l, int r) {
- if (2 * v + 1 < SZ(sum)) {
- add[2*v] += add[v];
- add[2*v+1] += add[v];
- }
- sum[v] += add[v] * (r - l + 1);
- add[v] = 0;
- }
- llint get(int v, int tl, int tr, int l, int r) {
- if (tl > tr || l > r)
- return 0;
- push(v, tl, tr);
- if (tl == l && tr == r)
- return sum[v] + add[v] * (tr - tl + 1);
- int mid = (tl + tr) / 2;
- return get(2 * v, tl, mid, l, min(mid, r)) +
- get(2 * v + 1, mid + 1, tr, max(l, mid + 1), r);
- }
- void add_val(int v, int tl, int tr, int l, int r, int val) {
- if (tl > tr || l > r)
- return;
- push(v, tl, tr);
- if (tl == l && tr == r) {
- add[v] += val;
- return;
- }
- int mid = (tl + tr) / 2;
- add_val(2 * v, tl, mid, l, min(mid, r), val);
- add_val(2 * v + 1, mid + 1, tr, max(l, mid + 1), r, val);
- sum[v] = sum[2*v] + sum[2*v+1] + add[2*v] * (mid - tl + 1) + add[2*v+1] * (tr - mid);
- }
- } t;
- void task(){
- cin >> n;
- for (int i = 0; i < n; ++i) {
- cin >> a[i];
- t.add_val(1, 0, n-1, i, i, a[i]);
- }
- int q;
- cin >> q;
- llint asdasd = 0;
- while (q--) {
- int b, l, r;
- int c;
- int d;
- cin >> b;
- if (b == 1) {
- cin >> l >> r >> c;
- --l, --r;
- t.add_val(1, 0, n-1, l, r, c);
- }
- if (b == 2) {
- cin >> d >> c;
- if (d < M) {
- add[d] += c;
- } else {
- for (int i = d - 1; i < n; i += d)
- t.add_val(1, 0, n-1, i, i, c);
- }
- }
- if (b == 3) {
- cin >> l >> r;
- --l, --r;
- llint ans = t.get(1, 0, n-1, l, r);
- ++r;
- for (int j = 1; j < M; ++j)
- ans += (r / j - l / j) * add[j];
- cout << ans << "\n";
- fflush(stdout);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment