Submission #1325927

#TimeUsernameProblemLanguageResultExecution timeMemory
1325927djsksbrbfXORanges (eJOI19_xoranges)C++20
100 / 100
232 ms21388 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
#define fi first
#define se second
#define pb push_back
const int MOD = 1e9 + 7;
const int MAX = 2e5 + 5;
#define int ll

int sege[4*MAX], sego[4*MAX];
vector <int> ev, od;
int a[MAX];

void upde(int l, int r, int id, int val, int pos){
   if(l == r){
      sege[pos] = val;
      ev[id] =val;
      return;
   }
   
   int mid = (l + r) >> 1;
   if(id <= mid)upde(l, mid, id, val, 2*pos);
   else upde(mid + 1, r, id, val, 2*pos + 1);
   
   sege[pos] = (sege[2*pos] ^ sege[2*pos + 1]);
}

void updo(int l, int r, int id, int val, int pos){
   if(l == r){
      sego[pos] = val;
      od[id] = val;
      return;
   }
   
   int mid = (l + r) >> 1;
   if(id <= mid)updo(l, mid, id, val, 2*pos);
   else updo(mid + 1, r, id, val, 2*pos + 1);
   
   sego[pos] = (sego[2*pos] ^ sego[2*pos + 1]);
}

int queo(int l, int r, int tl, int tr, int pos){
   if(r < tl || tr < l || tr< tl)return 0;
   if(tl <= l && r <= tr)return sego[pos];
   
   int mid = ( l + r) >> 1;
   return (queo(l, mid, tl, tr, 2*pos)^queo(mid + 1, r, tl, tr, 2*pos + 1));
}

int quee(int l, int r, int tl, int tr, int pos){
   if(r < tl || tr < l || tr< tl)return 0;
   if(tl <= l && r <= tr)return sege[pos];
   
   int mid = ( l + r) >> 1;
   return (quee(l, mid, tl, tr, 2*pos)^quee(mid + 1, r, tl, tr, 2*pos + 1));
}

signed main(){
   ios_base::sync_with_stdio(0);
   cin.tie(0);
   
   int n, q; cin >> n >> q;
   for(int i = 1 ; i <= n ; i++)cin >> a[i];
   
   map <int, int> pose, poso;
   for(int i = 1  ; i <= n ; i++){
      (i % 2 ? od : ev).pb(a[i]);
      if(i % 2){
         poso[i] = (int)od.size() - 1;
      }
      else pose[i] = (int)ev.size() - 1;
   }
   
   for(int i = 0 ; i < (int)od.size() ; i++){
      updo(0, (int)od.size() - 1, i, od[i], 1);
   }
   
   for(int i = 0 ; i < (int)ev.size() ; i++){
      upde(0, (int)ev.size() - 1, i, ev[i], 1);
   }
   
   while(q--){
      int op, x, y; cin >> op >>x >> y;
      if(op == 1){
         if(x % 2)updo(0, (int)od.size() - 1, poso[x], y, 1);
         else upde(0, (int)ev.size() - 1, pose[x], y, 1);
      }
      else{
         int l = x, r = y;
         
         if((r - l + 1) % 2){
            if(r % 2){
               cout << queo(0, (int)od.size() - 1, poso[l], poso[r], 1) << '\n';
            }
            else cout << quee(0, (int)ev.size() - 1, pose[l], pose[r], 1) << '\n';
         }
         else cout << 0 << '\n';
      }
   }
   
   return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...