Advertisement
Josif_tepe

Untitled

Mar 21st, 2023
700
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. const int maxn=200005;
  5. typedef long long ll;
  6. int n, m;
  7. int niza[maxn];
  8. struct node {
  9.     ll value;
  10.     int level;
  11. };
  12. node segment_tree[3 * maxn];
  13. void build_tree(int L, int R, int pos) {
  14.     if(L == R) {
  15.         segment_tree[pos].value = niza[L];
  16.         segment_tree[pos].level = 1;
  17.         return;
  18.     }
  19.     int mid = (L + R) / 2;
  20.     build_tree(L, mid, 2 * pos);
  21.     build_tree(mid + 1, R, 2 * pos + 1);
  22.     segment_tree[pos].level = segment_tree[2 * pos].level + 1;
  23.    
  24.     if(segment_tree[pos].level % 2 == 0) {
  25.         segment_tree[pos].value = (segment_tree[2 * pos].value | segment_tree[2 * pos + 1].value);
  26.     }
  27.    
  28.     else {
  29.         segment_tree[pos].value = (segment_tree[2 * pos].value ^ segment_tree[2 * pos + 1].value);
  30.     }
  31.                                
  32. }
  33. void update(int L, int R, int pos, int idx, ll new_value) {
  34.     if(L == R) {
  35.         segment_tree[pos].value = new_value;
  36.         return;
  37.     }
  38.     int mid = (L + R) / 2;
  39.     if(idx <= mid) {
  40.         update(L, mid, 2 * pos, idx, new_value);
  41.     }
  42.     else {
  43.         update(mid + 1, R,2 * pos + 1, idx, new_value);
  44.     }
  45.     if(segment_tree[pos].level % 2 == 0) {
  46.         segment_tree[pos].value = (segment_tree[2 * pos].value | segment_tree[2 * pos + 1].value);
  47.     }
  48.    
  49.     else {
  50.         segment_tree[pos].value = (segment_tree[2 * pos].value ^ segment_tree[2 * pos + 1].value);
  51.     }
  52. }
  53. int main()
  54. {
  55.     int n, m;
  56.     cin >> n >> m;
  57.     n = (1 << n);
  58.     for(int i = 0; i < n; i++) {
  59.         cin >> niza[i];
  60.     }
  61.     build_tree(0, n - 1, 1);
  62.     for(int i = 0; i < m; i++) {
  63.         int id;
  64.         ll v;
  65.         cin >> id >> v;
  66.         id--;
  67.         update(0, n - 1, 1, id, v);
  68.         cout << segment_tree[1].value << endl;
  69.     }
  70.     return 0;
  71. }
  72.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement