a_pramanik

Segmented Tree 1

Jun 6th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int a[1000];
  5. string b;
  6.  
  7. int tr[3*1003];
  8.  
  9. void build(int node, int l, int r){
  10.  
  11. if(l==r){
  12. tr[node]=a[l];
  13. return;
  14. }
  15.  
  16. int mid = (l+r)/2;
  17.  
  18. build(node*2, l, mid);
  19. build((node*2)+1, mid+1, r);
  20.  
  21. tr[node] = min(tr[node*2], tr[(node*2)+1]);
  22.  
  23. }
  24.  
  25. int query(int node, int s, int e, int l, int r){
  26.  
  27. if(s>=l && e<=r){
  28. return tr[node];
  29. }
  30.  
  31. int mid = (s+e)/2;
  32. if(l>mid){
  33. return query((node*2)+1, mid+1, e, l, r);
  34. }
  35.  
  36. else if(r<=mid){
  37. return query(node*2, s, mid, l, r);
  38. }
  39.  
  40. else{
  41. return min(query(node*2, s, mid, l, mid), query((node*2)+1, mid+1, e, mid+1, r));
  42. }
  43.  
  44. }
  45.  
  46. void update(int node, int s, int e, int ind, int val){
  47.  
  48. if(s==e){
  49. a[ind] = val;//not necessary
  50. tr[node]=val;
  51. return;
  52. }
  53.  
  54. int mid = (s+e)/2;
  55.  
  56. if(ind<=mid){
  57. update(node*2, s, mid, ind, val);
  58. }
  59.  
  60. else{
  61. update((node*2)+1, mid+1, e, ind, val);
  62. }
  63.  
  64. tr[node] = min(tr[node*2], tr[(node*2)+1]);
  65.  
  66.  
  67. }
  68.  
  69.  
  70. int main()
  71.  
  72. {
  73. int n, q, i, in, va, left, right;
  74. scanf("%d%d", &n, &q);
  75.  
  76.  
  77. for(i=1; i<=n; i++){
  78. scanf("%d", &a[i]);
  79. }
  80.  
  81. build(1, 1, n);
  82.  
  83. for(i=1; i<=q; i++){
  84. cin>>b;
  85. if(b=="up"){
  86. scanf("%d%d", &in, &va);
  87. update(1, 1, n, in, va);
  88. }
  89. else{
  90. scanf("%d%d", &left, &right);
  91. int ans = query(1, 1, n, left, right);
  92. printf("Minimum element: %d\n", ans);
  93. }
  94. }
  95.  
  96. return 0;
  97. }
Add Comment
Please, Sign In to add comment