#include<iostream> #include<vector> usingnamespace std; constint N = 20, K = 10, K2 = (1 << K); int a[(1 << N) + 5]; longlong s[K2 + 5][K2 + 5]; vector<int> ve1[K2 + 5], ve2[K2 + 5]; // 子集 超集 intmain(){ ios::sync_with_stdio(0); cin.tie(0); int n, q; cin >> n >> q; int l = n / 2; int r = n - l; int n2 = 1 << n; for (int i = 0; i <= n2 - 1; i++) { cin >> a[i]; } for (int i = 0; i <= (1 << r) - 1; i++) { for (int j = 0; j <= (1 << r) - 1; j++) { if ((i | j) == i) { ve1[i].push_back(j); ve2[j].push_back(i); } } } for (int i = 0; i <= n2 - 1; i++) { int high = i >> l; int low = i & ((1 << l) - 1); for (int x : ve2[low]) { if (x < (1 << l)) { s[high][x] += a[i]; } } }
while (q--) { int op, x, y; cin >> op; if (op == 1) { cin >> x; longlong ans = 0; int high = x >> l; int low = x & ((1 << l) - 1); for (int i : ve1[high]) { if (i <= (1 << r) - 1) ans += s[i][low]; } cout << ans << endl; } else { cin >> x >> y; int high = x >> l; int low = x & ((1 << l) - 1); for (int i : ve2[low]) { if (i <= (1 << l) - 1) s[high][i] += y - a[x]; } a[x] = y; } } return0; }