bhupixb

Square Root Decomp

Aug 15th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.57 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std ;
  3. typedef long long int ll ;
  4. const int N = 1 << 20 ;
  5. ll a[N] , b_index , b_size , lol[N] , n ;
  6. void update(ll pos , ll val ) {
  7. lol[pos / b_size] = lol[pos / b_size] - a[pos] + val ;
  8. a[pos] = val ;
  9. }
  10. ll query(ll left , ll right ) {
  11.  
  12. ll sum = 0 ;
  13. while(left <= right and left % b_size != 0 ) {
  14. sum += a[left] ;
  15. left++ ;
  16. }
  17. while(left + b_size <= right){
  18. sum += lol[left / b_size] ;
  19. left += b_size ;
  20. }
  21. while(left <= right) {
  22. sum += a[left] ;
  23. left++ ;
  24. }
  25. return sum ;
  26. }
  27. void add() {
  28. b_index = -1 ;
  29. b_size = sqrt(n) ;
  30. for(int i = 0 ; i < n ;i++ ) {
  31. if( i % b_size == 0 )
  32. b_index++ ;
  33. lol[b_index] += a[i] ;
  34. }
  35. }
  36. int main () {
  37. cin >> n ;
  38. for(int i = 0 ; i < n ; i++) {
  39. cin >> a[i] ;
  40. }
  41. add() ;
  42. int q ;
  43. cin >> q ;
  44. while(q--) {
  45. int x , y , z ;
  46. cin >> z ;
  47. if(z == 1) {
  48. int pos , val ;
  49. cin >> pos >> val ;
  50. update(pos , val ) ;
  51. }
  52. else {
  53. ll left , right ;
  54. cin >> left >> right ;
  55. cout << query(left - 1 , right - 1 ) << endl ;
  56. }
  57.  
  58. }
  59.  
  60. }
Add Comment
Please, Sign In to add comment