Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define pb push_back
- #define ll long long
- #define si short int
- #define speed ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
- #define pill pair<ll,ll>
- #define f first
- #define s second
- #define pilc pair<ll,char>
- #define all(a) (a).begin(),(a).end()
- #define rep(s,e,step) for(int i = (s); i < (e) ; i += step)
- #define vrep(s,e,step) for(int j = (s); j < (e) ; j += step)
- #define ex exit(0)
- #define sz(a) (a).size()
- using namespace std;
- const ll N = 5e5;
- const ll big = 1e18;
- const ll block = 800;
- const ll mod = 1e6;
- ll n, q;
- ll a[N];
- struct seg {
- ll t[4 * N] = {0};// ����� �� �������
- ll u[4 * N] = {0};// ���������� ������� ������� ������������ �� ���� �������
- ll up[4 * N] = {0};// ����� ������� ����� ��������� �� ���� ��������� �� �������
- // ����� ����� �� 1 �� n ��� (n * (n + 1)) / 2
- void push(ll v, ll tl, ll tr) {
- ll z = tr - tl + 1;
- t[v] += up[v] * z + u[v] * (z * (z + 1)) / 2;
- if(tl != tr) {
- ll m = (tl + tr) >> 1;
- up[v * 2] += up[v];
- up[v * 2 + 1] += up[v] + u[v] * (m - tl + 1);
- u[v * 2] += u[v];
- u[v * 2 + 1] += u[v];
- }
- u[v] = up[v] = 0;
- }
- void bld(ll v = 1, ll tl = 1, ll tr = n) {
- if(tl == tr)
- return (void)(t[v] = a[tl]);
- ll m = (tl + tr) >> 1;
- bld(v * 2, tl, m);
- bld(v * 2 + 1, m + 1, tr);
- t[v] = t[v * 2] + t[v * 2 + 1];
- }
- void upd(ll l, ll r, ll v = 1, ll tl = 1, ll tr = n) {
- push(v, tl, tr);
- if(tl > r || tr < l)
- return;
- if(l <= tl && tr <= r) {
- up[v] += tl - l;
- u[v]++;
- push(v, tl, tr);
- return;
- }
- ll m = (tl + tr) >> 1;
- upd(l, r, v * 2, tl, m);
- upd(l, r, v * 2 + 1, m + 1, tr);
- t[v] = t[v * 2] + t[v * 2 + 1];
- }
- ll get(ll l, ll r, ll v = 1, ll tl = 1, ll tr = n) {
- push(v, tl, tr);
- if(tl > r || l > tr)
- return 0;
- if(l <= tl && tr <= r)
- return t[v];
- ll m = (tl + tr) >> 1;
- return (get(l, r, v * 2, tl, m) +
- get(l, r, v * 2 + 1, m + 1, tr));
- }
- } rt;
- int main() {
- speed;
- cin >> n >> q;
- for(int i = 1; i <= n; i++)
- cin >> a[i];
- rt.bld();
- while(q--) {
- ll t, a, b;
- cin >> t >> a >> b;
- if(t == 1)
- rt.upd(a, b);
- else
- cout << rt.get(a, b) << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment