Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 1000007
- using namespace std;
- typedef long long ll;
- struct st{
- ll ans, sum, mul, trans;
- st() {}
- st(ll _ans, ll _sum, ll _mul, ll _trans): ans(_ans), sum(_sum), mul(_mul), trans(_trans){}
- };
- st seg[4*MAX];
- ll arr[MAX];
- void transform(int id, int l, int r, ll val){
- if(val > 0) seg[id].ans = (r-l+1)*val;
- seg[id].trans += val;
- }
- void mult(int id, int l, int r, ll val){
- seg[id].ans *= val;
- seg[id].mul *= val;
- }
- void add(int id, int l, int r, ll val){
- seg[id].ans += (r-l+1)*val;
- seg[id].mul += val;
- }
- void lazy(int id, int l, int r){
- int mid = (l+r)/2;
- add(2*id,l, mid, seg[id].sum);
- add(2*id+1, mid+1, r, seg[id].sum);
- seg[id].sum = 0;
- mult(2*id,l, mid, seg[id].mul);
- mult(2*id+1, mid+1, r, seg[id].mul);
- seg[id].mul = 1;
- transform(2*id,l, mid, seg[id].trans);
- transform(2*id+1, mid+1, r, seg[id].trans);
- seg[id].trans = 0;
- }
- void update(int id, int l, int r, int x, int y, ll val, int tipo){ //lazy
- if(l > y || r < x) return;
- else if( x <= l && r <= y){
- if(tipo == 1) add(id, l, r, val);
- if(tipo == 2) mult(id, l, r, val);
- if(tipo == 3) transform(id, l, r, val);
- }else{
- int mid = (l+r)/2;
- lazy(id, l, r);
- update(2*id, l, mid, x, y, val, tipo);
- update(2*id+1, mid+1, r, x, y, val, tipo);
- seg[id].ans = seg[2*id].ans + seg[2*id+1].ans;
- }
- }
- ll query(int id, int l, int r, int x, int y){
- if(l > y || r < x) return 0;
- else if( x <= l && r <= y) return seg[id].ans;
- else{
- int mid = (l+r)/2;
- lazy(id, l, r);
- return query(2*id, l, mid, x, y) + query(2*id+1, mid+1, r, x, y);
- }
- }
- int main(){
- int n; scanf("%d", &n);
- for(int i = 1; i <= n; i++) {
- scanf("%lld", &arr[i]);
- update(1, 1, n, i, i, arr[i], 1);
- }
- int q; scanf("%d", &q);
- while(q--){
- int type, l, r; scanf("%d %d %d", &type, &l, &r);
- if(type == 4){
- printf("%lld\n", query(1, 1, n, l, r));
- continue;
- }
- ll v; scanf("%lld", &v);
- update(1, 1, n, l, r, v, type);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement