Maruf_Hasan

Segment tree from shafaetBLog

Mar 14th, 2020
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.71 KB | None | 0 0
  1. #define mx 100001
  2. int arr[mx];
  3. int tree[mx * 3];
  4. void init(int node, int b, int e)
  5. {
  6. if (b == e) {
  7. tree[node] = arr[b];
  8. return;
  9. }
  10. int Left = node * 2;
  11. int Right = node * 2 + 1;
  12. int mid = (b + e) / 2;
  13. init(Left, b, mid);
  14. init(Right, mid + 1, e);
  15. tree[node] = tree[Left] + tree[Right];
  16. }
  17. int query(int node, int b, int e, int i, int j)
  18. {
  19. if (i > e || j < b)
  20. return 0; //বাইরে চলে গিয়েছে
  21. if (b >= i && e <= j)
  22. return tree[node]; //রিলেভেন্ট সেগমেন্ট
  23. int Left = node * 2; //আরো ভাঙতে হবে
  24. int Right = node * 2 + 1;
  25. int mid = (b + e) / 2;
  26. int p1 = query(Left, b, mid, i, j);
  27. int p2 = query(Right, mid + 1, e, i, j);
  28. return p1 + p2; //বাম এবং ডান পাশের যোগফল
  29. }
  30. void update(int node, int b, int e, int i, int newvalue)
  31. {
  32. if (i > e || i < b)
  33. return; //বাইরে চলে গিয়েছে
  34. if (b >= i && e <= i) { //রিলেভেন্ট সেগমেন্ট
  35. tree[node] = newvalue;
  36. return;
  37. }
  38. int Left = node * 2; //আরো ভাঙতে হবে
  39. int Right = node * 2 + 1;
  40. int mid = (b + e) / 2;
  41. update(Left, b, mid, i, newvalue);
  42. update(Right, mid + 1, e, i, newvalue);
  43. tree[node] = tree[Left] + tree[Right];
  44. }
  45. int main()
  46. {
  47. READ("in");
  48. int n;
  49. cin >> n;
  50. repl(i, n)
  51. cin
  52. >> arr[i];
  53. init(1, 1, n);
  54.  
  55. update(1, 1, n, 2, 0);
  56. cout << query(1, 1, n, 1, 3) << endl;
  57. update(1, 1, n, 2, 2);
  58. cout << query(1, 1, n, 2, 2) << endl;
  59. return 0;
  60. }
Add Comment
Please, Sign In to add comment