Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- //#define int long long
- constexpr int N = (int)2e5 + 111;
- constexpr int md = (int)998244353;
- int a[N];
- struct ST{
- int t[4*N][30];
- int w[4*N][30];
- ST(){
- memset(t,0,sizeof t);
- memset(w,0,sizeof w);
- }
- void push(int v){
- for(int j = 0; j < 30; j++){
- t[v<<1][j] += w[v][j];
- t[v<<1|1][j] += w[v][j];
- w[v<<1][j] += w[v][j];
- w[v<<1|1][j] += w[v][j];
- w[v][j] = 0;
- }
- return;
- }
- void upd(int v,int l,int r,int tl,int tr,int x){
- if(l > r || tl > tr) return;
- if(l == tl && r == tr){
- int d = 1;
- if(x < 0) x = -x, d = -1;
- for(int j = 0; j < 30; j++){
- if((x >> j & 1) == 0){
- t[v][j] += d;
- w[v][j] += d;
- }
- }
- return;
- }
- push(v);
- int m = (l+r)>>1;
- upd(v<<1,l,m,tl,min(tr,m),x);
- upd(v<<1|1,m+1,r,max(tl,m+1),tr,x);
- for(int j = 0; j < 30; j++){
- t[v][j] = min(t[v<<1][j],t[v<<1|1][j]);
- }
- return;
- }
- int get(int v,int l,int r,int tl,int tr){
- if(l > r || tl > tr) return 0;
- if(l == tl && r == tr) {
- int ans = 0;
- for(int j = 0; j < 30; j++){
- if(t[v][j] == 0)
- ans |= (1 << j);
- }
- // cout << "l,r: " << l << " " << r << ", ans: " << ans << "\n";
- return ans;
- }
- push(v);
- int m = (l+r)>>1;
- return get(v<<1,l,m,tl,min(tr,m)) | get(v<<1|1,m+1,r,max(tl,m+1),tr);
- }
- } ST;
- void solve(){
- int n,q;
- cin >> n >> q;
- for(int i = 1; i <= n; i++) cin >> a[i];
- for(int i = 1; i <= n; i++){
- ST.upd(1,1,n,i,i,a[i]);
- }
- int l[q+1],r[q+1],x[q+1];
- for(int i = 1; i <= q; i++){
- int tp;
- cin >> tp;
- if(tp == 1){
- cin >> l[i] >> r[i] >> x[i];
- ST.upd(1,1,n,l[i],r[i],x[i]);
- } else if(tp == 2){
- int l,r;
- cin >> l >> r;
- int ans = ST.get(1,1,n,l,r);
- cout << ans << "\n";
- } else {
- int id;
- cin >> id;
- ST.upd(1,1,n,l[id],r[id],-x[id]);
- }
- }
- return;
- }
- signed main(){
- ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
- // freopen("output.txt","w",stdout);
- int tests = 1;
- // cin >> tests;
- for(int test = 1; test <= tests; test++){
- solve();
- }
- return 0;
- }
- /**
- **/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement