Advertisement
Guest User

мега круте дерево відрізків

a guest
Oct 30th, 2014
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.77 KB | None | 0 0
  1.  
  2. #include <vector>
  3. #include <cstring>
  4. #include <cstdio>
  5.  
  6. using namespace std;
  7.  
  8. const int N = 1e5;
  9.  
  10. int n, a[N];
  11. int t[2 * N]; // 1. 2*n памяти
  12.  
  13. void build() { // O(n)
  14.   for (int i = 0; i < n; i++)
  15.     t[n + i] = a[i];
  16.   for (int i = n - 1; i > 0; i--)
  17.     t[i] = t[2 * i] + t[2 * i + 1];
  18. }
  19.  
  20. // [l..r] 0..n-1
  21. // k --> (2k, 2k+1)
  22. int get( int l, int r, int x, int y ) { // 2,3. O(log(r - l)), маленькая константа
  23.   int sum = 0;
  24.   for (l += n, r += n; l <= r; l >>= 1, r >>= 1) {
  25.     if   (l & 1)  sum += t[l++];
  26.     if (!(r & 1)) sum += t[r--];
  27.   }
  28.   return sum;
  29. }
  30.  
  31. // x >>= 5    x /= 32
  32. // x <<= 5    x *= 32
  33. void change( int i, int x ) {
  34.   i += n, t[i] = x;
  35.   for (i >>= 1; i >= 1; i >>= 1)
  36.     t[i] = t[2 * i] + t[2 * i + 1];
  37. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement