Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #define MAX 100010
  2.  
  3. struct Node
  4. {
  5.     lld prop,sum;
  6. };
  7.  
  8. Node tree[3*MAX+10];
  9. int arr[MAX+10];
  10.  
  11. void build(int node, int start, int eend)
  12. {
  13.     if(start==eend)
  14.     {
  15.         tree[node].sum=0;
  16.         tree[node].prop=-1;
  17.         return ;
  18.     }
  19.  
  20.     int mid = (start+eend)>>1;
  21.  
  22.     int nleft = node<<1;
  23.  
  24.     build(nleft,start,mid);
  25.     build(nleft+1,mid+1,eend);
  26.  
  27.     tree[node].sum = tree[nleft].sum+tree[nleft+1].sum;
  28. }
  29.  
  30.  
  31. void lazy_update(int node, int start, int eend,int x)
  32. {
  33.     tree[node].prop = x;
  34.     tree[node].sum = (eend-start+1)*x;
  35. }
  36.  
  37. void node_update(int node, int start, int eend)
  38. {
  39.     int mid = (start+eend)>>1;
  40.     int nleft = node<<1;
  41.     int nright = nleft+1;
  42.  
  43.     tree[nleft].prop = tree[nright].prop = tree[node].prop;
  44.  
  45.     tree[nleft].sum = (mid-start+1)*tree[nleft].prop;
  46.     tree[nright].sum = (eend-mid)*tree[nright].prop;
  47.  
  48.     tree[node].prop=-1;
  49. }
  50.  
  51. void update(int node, int start, int eend, int left, int right, int x)
  52. {
  53.     if(start==left && eend==right)
  54.     {
  55.         lazy_update(node,start,eend,x);
  56.         return ;
  57.     }
  58.  
  59.     if(tree[node].prop!=-1)
  60.     {
  61.         node_update(node,start,eend);
  62.     }
  63.  
  64.     int mid = (start+eend)>>1;
  65.  
  66.     int nleft = node<<1;
  67.  
  68.     if(right<=mid)
  69.     {
  70.         update(nleft,start,mid,left,right,x);
  71.     }
  72.     else if(left>mid)
  73.     {
  74.         update(nleft+1,mid+1,eend,left,right,x);
  75.     }
  76.     else
  77.     {
  78.         update(nleft,start,mid,left,mid,x);
  79.         update(nleft+1,mid+1,eend,mid+1,right,x);
  80.     }
  81.  
  82.     tree[node].sum = tree[nleft].sum+tree[nleft+1].sum;
  83. }
  84.  
  85. lld query(int node, int start, int eend, int left,int right)
  86. {
  87.     if(start==left && eend==right)
  88.     {
  89.         return tree[node].sum;
  90.     }
  91.  
  92.     if(tree[node].prop!=-1)
  93.     {
  94.         node_update(node,start,eend);
  95.     }
  96.  
  97.     int mid = (start+eend)>>1;
  98.  
  99.     int nleft = node<<1;
  100.  
  101.     lld res=0;
  102.  
  103.     if(right<=mid)
  104.     {
  105.         res+=query(nleft,start,mid,left,right);
  106.     }
  107.     else if(left>mid)
  108.     {
  109.         res+=query(nleft+1,mid+1,eend,left,right);
  110.     }
  111.     else
  112.     {
  113.         res+=query(nleft,start,mid,left,mid);
  114.         res+=query(nleft+1,mid+1,eend,mid+1,right);
  115.     }
  116.  
  117.     tree[node].sum = tree[nleft].sum+tree[nleft+1].sum;
  118.  
  119.     return res;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement