fredisj

2857 - Speedwagon Flow

Nov 14th, 2022
784
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.79 KB | None | 0 0
  1. /*--
  2. SUBMISSION # 30586354
  3.  
  4. Problem:
  5.     2857 - SpeedWagon Flow
  6. Answer:
  7.     Accepted
  8. Language:
  9.     C++17 (g++ 7.3.0, -std=c++17 -O2 -lm) [+0s]
  10. Runtime:
  11.     0.353s
  12. File size:
  13.     2.53 KB
  14. Memory:
  15.     -
  16. Submission:
  17.     10/28/22, 2:14:41 PM
  18. --*/
  19.  
  20. #include<iostream>
  21. #include<algorithm>
  22. #include<cstring>
  23. #include<utility>
  24. #include<vector>
  25.  
  26. using namespace std;
  27.  
  28. void build(int V[], int t[], int idx[], int lazy[], int v, int tl, int tr) {
  29.   if(tl == tr) {
  30.     t[v] = V[tr];
  31.     idx[v] = tr;
  32.     lazy[v] = 0;
  33.   }
  34.   else {
  35.     int tm = (tl+tr)/2;
  36.  
  37.     build(V,t,idx,lazy,v*2+1,tl,tm);
  38.     build(V,t,idx,lazy,v*2+2,tm+1,tr);
  39.     lazy[v] = 0;
  40.     t[v] = t[v*2+1] + t[v*2+2];
  41.   }
  42. }
  43.  
  44. int query(int t[], int idx[], int lazy[], int v, int tl, int tr, int l, int r) {
  45.  
  46.     if(lazy[v] != 0) {
  47.     t[v] += lazy[v];
  48.     if(tl != tr) {
  49.       lazy[v*2+1] += lazy[v];
  50.       lazy[v*2+2] += lazy[v];
  51.     }
  52.     lazy[v] = 0;
  53.   }
  54.  
  55.     if(tl > tr || l > r)
  56.       return 0;
  57.  
  58.     if(l <= tl && tr <= r)
  59.       return t[v];
  60.  
  61.     int tm = (tl+tr)/2;
  62.  
  63.     int ql = query(t,idx,lazy,v*2+1,tl,tm,l,min(r,tm));
  64.     int qr = query(t,idx,lazy,v*2+2,tm+1,tr,max(l,tm+1),r);
  65.  
  66.     return (ql+qr);
  67.  
  68. }
  69.  
  70. void update(int t[], int idx[], int lazy[], int v, int tl, int tr, int l, int r, int addend) {
  71.  
  72.   if(lazy[v] != 0) {
  73.     t[v] += lazy[v];
  74.     if(tl != tr) {
  75.       lazy[v*2+1] += lazy[v];
  76.       lazy[v*2+2] += lazy[v];
  77.     }
  78.     lazy[v] = 0;
  79.   }
  80.  
  81.   if(tl <= l && r <= tr && tl <= tr && l <= r) {
  82.     if(l <= tl && tr <= r) {
  83.       t[v] += addend;
  84.       if(tl != tr) {
  85.     lazy[v*2+1] += addend;
  86.     lazy[v*2+2] += addend;
  87.       }
  88.     } else {
  89.       int tm = (tl+tr)/2;
  90.  
  91.       update(t,idx,lazy,v*2+1,tl,tm,l,min(r,tm),addend);
  92.       update(t,idx,lazy,v*2+2,tm+1,tr,max(l,tm+1),r,addend);
  93.  
  94.       t[v] = t[v*2+1] + t[v*2+2];
  95.  
  96.     }
  97.    
  98.   }
  99.  
  100. }
  101.  
  102. int main(int argc, char **argv) {
  103.  
  104.   ios_base::sync_with_stdio(false);
  105.   cin.tie(NULL);
  106.  
  107.   int N, M;
  108.  
  109.   cin >> N >> M;
  110.  
  111.   int* V = new int[N];
  112.   int* t = new int[4*N];
  113.   int* idx = new int[4*N];
  114.   int* lazy = new int[4*N];
  115.  
  116.   memset(V,0,N);
  117.   memset(t,0,4*N);
  118.   memset(idx,0,4*N);
  119.   memset(lazy,0,4*N);
  120.  
  121.   build(V,t,idx,lazy,0,0,N-1);
  122.  
  123.   for(int i = 0; i < M; i++) {
  124.     int a, b, c, d, q, x;
  125.     int X, Y;
  126.  
  127.     cin >> x;
  128.  
  129.     if(x == 1){
  130.       cin >> a >> b;
  131.       update(t, idx, lazy, 0, 0, N-1, a-1, a-1, b);
  132.     }
  133.  
  134.     if(x == 2){
  135.       cin >> a >> b >> c >> d;
  136.  
  137.       X = max(a,c);
  138.       Y = min(b,d);
  139.  
  140.       int q1 = query(t,idx,lazy,0,0,N-1,a-1,b-1);
  141.       int q2 = query(t,idx,lazy,0,0,N-1,c-1,d-1);
  142.       int q3 = query(t,idx,lazy,0,0,N-1,X-1,Y-1);
  143.  
  144.       cout << ((q1+q2)-q3) << endl;
  145.       }
  146.      
  147.   }
  148.  
  149.  
  150.   delete[] V;
  151.   delete[] t;
  152.   delete[] idx;
  153.   delete[] lazy;
  154.  
  155.   return 0;
  156.  
  157. }
  158.  
Advertisement
Add Comment
Please, Sign In to add comment