willy108

XJOI_1399_3.cpp

Jun 1st, 2020
350
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <ctime>
  6. #include <cmath>
  7. #include <cassert>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <string>
  11. #include <map>
  12. #include <set>
  13. #include <sstream>
  14. #include <list>
  15. #include <unordered_map>
  16. #include <unordered_set>
  17. #include <functional>
  18.  
  19. #define max_v 66000
  20. #define int_max 0x3f3f3f3f
  21. #define cont continue
  22. #define byte_max 0x3f
  23. #define pow_2(n) (1 << n)
  24. #define LG_pow2(n) (pow_2((int)(ceil(log2(n)))))
  25. using namespace std;
  26.  
  27. void setIO(const string& file_name){
  28.     freopen((file_name+".in").c_str(), "r", stdin);
  29.     freopen((file_name+".out").c_str(), "w+", stdout);
  30. }
  31. int d[max_v * 2]; //max
  32. int add[max_v * 2];
  33.  
  34. class seg_tree{
  35.   int n, s;
  36.  
  37.   int Q_max(int l, int r, int k, int L, int R){ //l and r are the query, k is the index, L and R are k's interval
  38.     //printf("%d %d %d %d %d %d\n", l+1, r+1, k, L+1, R+1, (int)(l <= L && R <= r));
  39.     if(R <= l || r <= L) return -int_max;
  40.     if(l <= L && R <= r) return d[k] + add[k];
  41.     int mid = (L + R) / 2, lc = k*2 + 1, rc = k*2 + 2;
  42.      
  43.     return add[k] + max(Q_max(l, r, lc, L, mid), Q_max(l, r, rc, mid, R));
  44.   }
  45.  
  46.  
  47.   void A(int l, int r, int k, int L, int R, int val){
  48.     if(R <= L || R <= l || r <= L) return;
  49.     int lc = k*2 + 1, rc = k*2 + 2;
  50.     int mid = (L + R) / 2;
  51.     if(l <= L && R <= r){
  52.       add[k] += val;
  53.     }else{
  54.       A(l, r, lc, L, mid, val);
  55.       A(l, r, rc, mid, R, val);
  56.       d[k] = max(d[lc] + add[lc], d[rc] + add[rc]);    
  57.     }
  58.  
  59.   }
  60.  
  61.   public:
  62.     seg_tree(int* arr, int s){
  63.       n = LG_pow2(s);
  64.       this->s = s;
  65.      
  66.       memset(d, 0x8f, sizeof(d));
  67.      
  68.       for(int i = n - 1; i < n + s - 1; i++){
  69.         d[i] = arr[i - (n - 1)];
  70.       }
  71.  
  72.       for(int i = n - 2; i >= 0; i--){
  73.         d[i] = max(d[i*2 + 1], d[i*2 + 2]);
  74.       }
  75.      
  76.     }
  77.    
  78.     int query_max(int l, int r){
  79.       return Q_max(l, r, 0, 0, n);
  80.     }
  81.  
  82.     void udpate(int k, int i){ //k is the index, i is the new value
  83.       d[n + k - 1] = i;
  84.       k += n - 1;
  85.       while(k){
  86.         k = (k - 1) / 2;
  87.         int lc = k*2 + 1, rc = k*2 + 2;
  88.         d[k] = max(d[lc] + add[lc], d[rc] + add[rc]);
  89.       }
  90.     }
  91.    
  92.     void range_update(int l, int r, int val){ //add val to all the values between [l, r)
  93.       A(l, r, 0, 0, n, val);
  94.     }
  95.  
  96.     void print_leaves(){
  97.       for(int i = n - 1; i< n - 1 + s; i++) printf("%d ", d[i]);
  98.       puts("");
  99.     }
  100.    
  101.     void print_all(){
  102.       for(int i = 0; i<n*2; i++) printf("%d ", d[i]);
  103.       puts("");
  104.     }
  105.  
  106. };
  107.  
  108. int arr[max_v];
  109.  
  110. int main(){
  111.   int C, S, Q;
  112.   scanf("%d%d%d", &C, &S, &Q);
  113.  
  114.   seg_tree s(arr, C);//init all to 0
  115.  
  116.   while(Q--){
  117.     int st, d, w; //start, dest, weight/cost
  118.     scanf("%d%d%d", &st, &d, &w);
  119.    
  120.    // d++;
  121.     if(s.query_max(st, d) + w > S) printf("N\n");
  122.     else{
  123.        printf("T\n");
  124.        s.range_update(st, d, w);
  125.     }
  126.  
  127.   }
  128.  
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment