给定n,m,代表有2n个数,m次询问
每次询问时先将此时序列第p个数值改为b,在求序列的值。序列的值定义如下。
将序列中的第2*i项与2*i-1项或,得到新序列,再把新序列的第2*i项与2*i-1项做异或操作,再将新序列进行或操作,如此往复,最终得到一个数,称为序列的值
线段树水题
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define INF 0x3f3f3f3f 5 using namespace std; 6 typedef long long LL; 7 8 const int maxn = (1 << 17) + 5; 9 int da[maxn * 4]; 10 int n, m; 11 int p, b; 12 13 int n_; 14 15 void build() { 16 int op = 0; 17 int k = n_ + n_ - 2; 18 k = (k - 1) / 2; 19 int t = n; 20 while (k > 0) { 21 if (k == (1 << t) - 2) {op ^= 1;t--;} 22 if (op == 1) { 23 da[k] = da[k * 2 + 1] | da[k * 2 + 2]; 24 } else { 25 da[k] = da[k * 2 + 1] ^ da[k * 2 + 2]; 26 } 27 k--; 28 } 29 } 30 31 void update(int k, int val) { 32 k += n_ - 2; 33 da[k] = val; 34 int op = 0; 35 while (k > 0) { 36 k = (k - 1) / 2; 37 op = 1 - op; 38 if (op == 1) { 39 da[k] = da[k * 2 + 1] | da[k * 2 + 2]; 40 } else { 41 da[k] = da[k * 2 + 1] ^ da[k * 2 + 2]; 42 } 43 } 44 } 45 46 int main() { 47 scanf("%d%d", &n, &m); 48 n_ = (1 << n); 49 for (int i = 0; i < n_; i++) { 50 scanf("%d", da + n_ + i - 1); 51 } 52 build(); 53 while (m--) { 54 scanf("%d%d", &p, &b); 55 update(p, b); 56 printf("%d\n", da[0]); 57 } 58 return 0; 59 }