fredisj

2546 - Allowance

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