Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int int64_t
- using namespace std;
- constexpr int N = 300;
- class sqrt_decomposition{
- vector<long long> a, d, lz;
- static inline bool in(int b, int l, int r){
- int L = b * N, R = L + N - 1;
- return L >= l && R <= r;
- }
- inline void native_upd(int b, int l, int r, int val){
- int L = b * N, R = L + N - 1;
- d[b] = 0;
- for(int i = L; i <= R; i++){
- a[i] += lz[b];
- if(l <= i && i <= r)
- a[i] += val;
- d[b] += a[i];
- }
- lz[b] = 0;
- }
- long long native_get(int b, int l, int r){
- int L = b * N, R = L + N - 1;
- long long ans = 0;
- d[b] = 0;
- for(int i = L; i <= R; i++){
- a[i] += lz[b];
- if(l <= i && i <= r)
- ans += a[i];
- d[b] += a[i];
- }
- lz[b] = 0;
- return ans;
- }
- public:
- sqrt_decomposition() = default;
- sqrt_decomposition(vector<long long> &in){
- a = in;
- while(a.size() % N)
- a.push_back(0);
- d.assign(a.size() / N, 0LL);
- lz.assign(a.size() / N, 0LL);
- for(int i = 0; i < a.size(); i++)
- d[i / N] += a[i];
- }
- void update(int l, int r, int x){
- int L = l / N, R = r / N;
- for(int i = L; i <= R; i++)
- if(in(i, l, r)) {
- d[i] += N * x;
- lz[i] += x;
- }
- else
- native_upd(i, l, r, x);
- }
- long long get(int l, int r){
- int L = l / N, R = r / N;
- long long ans = 0;
- for(int i = L; i <= R; i++){
- if(in(i, l, r))
- ans += d[i];
- else
- ans += native_get(i, l, r);
- }
- return ans;
- }
- };
- int32_t main()
- {
- ios::sync_with_stdio(false);
- cin.tie(nullptr); cout.tie(nullptr);
- int n, q;
- cin >> n >> q;
- vector<long long> a(n);
- for(auto &i: a)
- cin >> i;
- sqrt_decomposition d(a);
- while (q--){
- int t;
- cin >> t;
- if(t == 1){
- int l, r;
- cin >> l >> r;
- l--, r--;
- cout << d.get(l, r) << '\n';
- }
- else{
- int l, r, v;
- cin >> l >> r >> v;
- l--, r--;
- d.update(l, r, v);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment