Tranvick

RMQ

Feb 3rd, 2013
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.15 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6. #define N 111111
  7. struct cell{
  8.     int l,r,max,add;
  9. } a[4*N];
  10.  
  11. void build(int x,int l,int r){
  12.     a[x].l=l;a[x].r=r;a[x].max=a[x].add=0;
  13.     if (a[x].l<a[x].r){
  14.         build(x+x,l,(l+r)>>1);
  15.         build(x+x+1,1+((l+r)>>1),r);
  16.     }
  17. }
  18.  
  19. int get_max(int x,int sumadd=0){
  20.     return a[x].max+a[x].add+sumadd;
  21. }
  22.  
  23. void modify(int x,int l,int r,int val){
  24.     if (!x || a[x].r < l || a[x].l > r) return;
  25.     if (l<=a[x].l && r>=a[x].r){
  26.         a[x].add+=val;
  27.         return;
  28.     }
  29.     modify(x+x,l,r,val);
  30.     modify(x+x+1,l,r,val);
  31.     a[x].max=max(get_max(x+x),get_max(x+x+1));
  32. }
  33.  
  34. int findmax(int x,int l,int r,int sumadd){
  35.     if (!x || a[x].r < l || a[x].l > r) return 0;
  36.     if (l<=a[x].l && r>=a[x].r) return get_max(x,sumadd);
  37.     return max(findmax(x+x,l,r,sumadd+a[x].add),findmax(x+x+1,l,r,sumadd+a[x].add));
  38. }
  39.  
  40. int main(){
  41. //  freopen("in","r",stdin);
  42. //  freopen("out","w",stdout);
  43.    
  44.     int n,q;
  45.     cin>>n>>q;
  46.    
  47.     build(1,1,n);
  48.     while (q--){
  49.         int t,l,r,val; cin >> t;
  50.         if (t==1){
  51.             cin>>l>>r>>val;
  52.             modify(1,l,r,val);
  53.         }else{
  54.             cin>>l>>r;
  55.             cout<<findmax(1,l,r,0)<<endl;
  56.         }
  57.     }
  58.    
  59.     return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment