Advertisement
Farjana_akter

Untitled

Nov 24th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.54 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. long long int arr[1000005],tree[1000005];
  4.  
  5.  
  6. void buildtree(long long int node,long long int start,long long int e)
  7. {
  8. if(start==e)
  9. {
  10. tree[node]=arr[e];
  11. return;
  12. }
  13. long long int mid=(start+e)/2;
  14. long long int left=node*2;
  15. long long int right=left+1;
  16. buildtree(left,start,mid);
  17. buildtree(right,mid+1,e);
  18. tree[node]=tree[left]+tree[right];
  19. }
  20.  
  21.  
  22. void update(long long int node,long long int start,long long int e,long long int index,long long int value)
  23. {
  24. if(index>e||index<start)
  25. return;
  26. if(start==e)
  27. {
  28. // cout<<" before update "<<tree[node]<<endl;
  29. tree[node]=value;
  30. // cout<<"updated value "<<tree[node]<<endl;
  31. return;
  32. }
  33. long long int mid=(start+e)/2;
  34. long long int left=node*2;
  35. long long int right=left+1;
  36. update(left,start,mid,index,value);
  37. update(right,mid+1,e,index,value);
  38. tree[node]=tree[left]+tree[right];
  39. }
  40.  
  41.  
  42. long long int query(long long int node,long long int start,long long int e,long long int ranges,long long int rangef)
  43. {
  44. if(ranges>e||rangef<start)
  45. {
  46. return 0;
  47. }
  48. if(ranges<=start&&rangef>=e)
  49. {
  50. return tree[node];
  51. }
  52. long long int left=node*2;
  53. long long int right=left+1;
  54. long long int mid=(start+e)/2;
  55. long long int ans1=query(left,start,mid,ranges,rangef);
  56. long long int ans2=query(right,mid+1,e,ranges,rangef);
  57. return ans1+ans2;
  58.  
  59. }
  60.  
  61.  
  62. int main()
  63. {
  64. long long int n,q,cas,t,index,value,rangef,ranges,ans,flag;
  65. scanf("%lld",&t);
  66. for(cas=1;cas<=t;cas++)
  67. {
  68.  
  69. scanf("%lld %lld",&n,&q);
  70. for(int i=1;i<=n;i++)
  71. {
  72. scanf("%lld",&arr[i]);
  73. }
  74. buildtree(1,1,n);
  75. printf("Case %lld:\n",cas);
  76. while(q--)
  77. {
  78. scanf("%lld",&flag);
  79. if(flag==1)
  80. {
  81. scanf("%lld",&index);
  82. printf("%lld\n",arr[index+1]);
  83. arr[index+1]=0;
  84. update(1,1,n,index+1,0);
  85.  
  86. }
  87. else if(flag==2)
  88. {
  89. scanf("%lld %lld",&index,&value);
  90. arr[index+1]=arr[index+1]+value;
  91. update(1,1,n,index+1,arr[index+1]);
  92. }
  93. else
  94. {
  95. scanf("%lld %lld",&ranges,&rangef);
  96. ans=query(1,1,n,ranges+1,rangef+1);
  97. printf("%lld\n",ans);
  98. }
  99. }
  100. }
  101. return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement