Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define maxn 500005
- #define ll long long
- #define int long long
- ll a[maxn] , p[maxn * 4] , addv[maxn * 4];
- ll pre[maxn] , ansl[maxn] , ansr[maxn];
- struct op {
- int ql , qr , k;
- }b[maxn];
- struct Query {
- int id , ql , qr;
- };
- vector<Query> v[maxn];
- int ql , qr , k;
- void maintain(int o) {
- p[o] = p[o * 2] + p[o * 2 + 1];
- }
- void build(int l , int r , int o) {
- if(l == r) {
- p[o] = a[l];
- return ;
- }
- int mid = l + (r - l) / 2;
- build(l , mid , o * 2);
- build(mid + 1 , r , o * 2 + 1);
- maintain(o);
- }
- void push(int l , int r , int o) {
- int mid = l + (r - l) / 2;
- int lc = o * 2 , rc = o * 2 + 1;
- if(addv[o]) {
- addv[lc] += addv[o];
- addv[rc] += addv[o];
- p[lc] += (mid - l + 1) * addv[o];
- p[rc] += (r - mid) * addv[o];
- addv[o] = 0;
- }
- }
- void update(int l , int r , int o) {
- if(ql <= l && r <= qr) {
- p[o] += (r - l + 1) * k;
- addv[o] += k;
- return ;
- }
- push(l , r , o);
- int mid = l + (r - l) / 2;
- if(ql <= mid) update(l , mid , o * 2);
- if(qr > mid) update(mid + 1 , r , o * 2 + 1);
- maintain(o);
- }
- ll query(int l , int r , int o) {
- if(ql <= l && r <= qr) {
- return p[o];
- }
- push(l , r , o);
- int mid = l + (r - l) / 2;
- if(qr <= mid) return query(l , mid , o * 2);
- else if(ql > mid) return query(mid + 1 , r , o * 2 + 1);
- else return query(l , mid , o * 2) + query(mid + 1 , r , o * 2 + 1);
- }
- int32_t main() {
- int n , m;
- scanf("%lld%lld" , &n , &m);
- for(int i = 1; i <= n; i++) {
- scanf("%lld" , &a[i]);
- }
- for(int i = 1; i <= m; i++) {
- scanf("%lld%lld%lld" , &b[i].ql , &b[i].qr , &b[i].k);
- }
- for(int i = 1; i <= n; i++) {
- pre[i] = pre[i - 1] + a[i];
- }
- int q;
- scanf("%lld" , &q);
- for(int i = 1; i <= q; i++) {
- int l , r;
- scanf("%lld%lld%lld%lld" , &ql , &qr , &l , &r);
- v[l - 1].push_back((Query){-i , ql , qr});
- v[r].push_back((Query){i , ql , qr});
- }
- build(1 , n , 1);
- for(int i = 0; i < v[0].size(); i++) {
- Query u = v[0][i];
- ql = u.ql , qr = u.qr;
- (u.id < 0 ? ansl[-u.id] : ansr[u.id]) = query(1 , n , 1);
- if(u.id > 0) ansr[u.id] += pre[qr] - pre[ql - 1];
- }
- for(int i = 1; i <= m; i++) {
- ql = b[i].ql;
- qr = b[i].qr;
- k = b[i].k;
- update(1 , n , 1);
- for(int j = 0; j < v[i].size(); j++) {
- Query u = v[i][j];
- ql = u.ql , qr = u.qr;
- (u.id < 0 ? ansl[-u.id] : ansr[u.id]) = query(1 , n , 1);
- if(u.id > 0) ansr[u.id] += pre[qr] - pre[ql - 1];
- }
- }
- for(int i = 1; i <= q; i++) {
- printf("%lld\n" , ansr[i] - ansl[i]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement