Advertisement
hkshakib

Untitled

Feb 3rd, 2020
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define mx 1000001
  4. int arr[mx];
  5. int tree[mx*3];
  6. void init(int node,int b,int e)
  7. {
  8. if(b==e)
  9. {
  10. tree[node]=arr[b];
  11. return;
  12. }
  13. int Left=node*2;
  14. int Right=node*2+1;
  15. int mid=(b+e)/2;
  16. init(Left,b,mid);
  17. init(Right,mid+1,e);
  18. tree[node]=tree[Left]+tree[Right];
  19. }
  20.  
  21. int query(int node,int b,int e,int i,int j)
  22. {
  23. if(i>e||j<b)
  24. return 0;
  25. if(b>=i && e<=j)
  26. return tree[node];
  27. int Left=node*2;
  28. int Right=node*2+1;
  29. int mid=(b+e)/2;
  30. int p1=query(Left,b,mid,i,j);
  31. int p2=query(Right,mid+1,e,i,j);
  32. return p1+p2;
  33. }
  34. void update(int node,int b,int e,int i,int newvalue)
  35. {
  36. if(i>e||i<b)
  37. return;
  38. if(b>=i&&e<=i)
  39. {
  40. tree[node]=newvalue;
  41. return;
  42. }
  43. int Left=node*2;
  44. int Right=node*2+1;
  45. int mid=(b+e)/2;
  46. update(Left,b,mid,i,newvalue);
  47. update(Right,mid+1,e,i,newvalue);
  48. tree[node]=tree[Left]+tree[Right];
  49. }
  50.  
  51. int main()
  52. {
  53. int n,cnt=1;
  54. while(scanf("%d",&n) && n!=0)
  55. {
  56. for(int i=1; i<=n; i++)
  57. {
  58. scanf("%d",&arr[i]);
  59. }
  60. printf("Case %d:\n",cnt++);
  61. getchar();
  62. init(1,1,n);
  63. char s[5];
  64. while(scanf("%s",s)==1)
  65. {
  66. if(s[0]=='E')
  67. {
  68. break;
  69. }
  70. else if(s[0]=='M')
  71. {
  72. int a,b;
  73. scanf("%d%d",&a,&b);
  74. int ans = query(1,1,n,a,b) ;
  75. printf("%d\n",ans);
  76. }
  77. else
  78. {
  79. int a,b;
  80. scanf("%d%d",&a,&b);
  81. update(1,1,n,a,b);
  82. }
  83. }
  84. }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement