Advertisement
dmkozyrev

1081.cpp

Oct 27th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <vector>
  4.  
  5. typedef long long lld;
  6.  
  7. struct SegmentTree {
  8. std::vector<lld> data;
  9.  
  10. void __build(const std::vector<int>& arr, int index, int left, int right) {
  11. if (left == right) {
  12. data[index] = arr[left];
  13. //printf("sum[%d, %d]=%lld\n", left, right, data[index]);
  14. return;
  15. }
  16. int mid = (left+right) >> 1;
  17. int lc = (index << 1) + 1;
  18. int rc = lc+1;
  19. __build(arr, lc, left, mid);
  20. __build(arr, rc, mid+1, right);
  21. data[index] = data[2*index+1] + data[2*index+2];
  22. //printf("sum[%d, %d]=%lld\n", left, right, data[index]);
  23. }
  24.  
  25. lld __sum(int index, int left, int right, int need_left, int need_right) {
  26. if (need_left > need_right) {
  27. return 0;
  28. }
  29.  
  30. if (left == need_left && right == need_right) {
  31. return data[index];
  32. }
  33.  
  34. int mid = (left + right) >> 1;
  35. int lc = (index << 1) + 1;
  36. int rc = lc+1;
  37. return __sum(lc, left, mid, need_left, std::min(need_right, mid))+
  38. __sum(rc, mid+1, right, std::max(need_left, mid+1), need_right);
  39. }
  40.  
  41. SegmentTree(const std::vector<int>& arr){
  42. int n = (int) arr.size();
  43. data.assign(4*n, 0);
  44. __build(arr, 0, 0, n-1);
  45. }
  46.  
  47. lld sum(int left, int right) {
  48. int n = (int)data.size() / 4;
  49. return __sum(0, 0, n-1, left, right);
  50. }
  51.  
  52. };
  53.  
  54. int main() {
  55. freopen("input.txt", "rt", stdin);
  56.  
  57. int n;
  58. scanf("%d", &n);
  59.  
  60. std::vector<int> a(n);
  61. for (auto& it : a) {
  62. scanf("%d", &it);
  63. //printf("%d ", it);
  64. }
  65. //printf("\n");
  66.  
  67. SegmentTree st(a);
  68.  
  69. int m;
  70. scanf("%d", &m);
  71.  
  72.  
  73. std::vector<int> left(m), right(m);
  74. for (int i = 0; i < m; ++i) {
  75. scanf("%d %d", &left[i], &right[i]);
  76. }
  77.  
  78. std::vector<lld> answers(m);
  79. for (int i = 0; i < m; ++i) {
  80. answers[i] = st.sum(left[i]-1, right[i]-1);
  81. }
  82.  
  83. for (auto it:answers) {
  84. //printf("%lld ", it);
  85. printf("%I64d ", it);
  86. }
  87.  
  88. return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement