Submission #1301073

#TimeUsernameProblemLanguageResultExecution timeMemory
1301073yus1f_mXORanges (eJOI19_xoranges)C++20
0 / 100
108 ms16456 KiB
#pragma GCC optimize("O3") #include <bits/stdc++.h> #define ll long long #define str string #define pb push_back #define pf push_front #define in insert #define all(v) v.begin(),v.end() #define fastIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); const int sz=1000000,INF=1000000000; using namespace std; vector<ll>nums,xors1,xors2; void build(ll left,ll right,ll index) { if(left==right) { if(left%2==0) { xors1[index]=nums[left],xors2[index]=0; } else { xors1[index]=0,xors2[index]=nums[left]; } } else { ll middle=(left+right)/2; build(left,middle,2*index); build(middle+1,right,2*index+1); xors1[index]=xors1[2*index]^xors1[2*index+1],xors2[index]=xors2[2*index]^xors2[2*index+1]; } } ll getXor1(ll left,ll right,ll index,ll Left,ll Right) { if(left>Right || right<Left) { return 0; } if(left>=Left && right<=Right) { return xors1[index]; } else { ll middle=(left+right)/2; return getXor1(left,middle,2*index,Left,Right)^getXor1(middle+1,right,2*index+1,Left,Right); } } ll getXor2(ll left,ll right,ll index,ll Left,ll Right) { if(left>Right || right<Left) { return 0; } if(left>=Left && right<=Right) { return xors2[index]; } else { ll middle=(left+right)/2; return getXor2(left,middle,2*index,Left,Right)^getXor2(middle+1,right,2*index+1,Left,Right); } } void update(ll left,ll right,ll index,ll Index,ll Num) { if(Index>=left && Index<=right) { if(left==right) { if(left%2==0) { xors1[index]=Num,xors2[index]=0; } else { xors1[index]=0,xors2[index]=Num; } } else { ll middle=(left+right)/2; if(Index<=middle) { update(left,middle,2*index,Index,Num); } else { update(middle+1,right,2*index+1,Index,Num); } xors1[index]=xors1[2*index]^xors1[2*index+1],xors2[index]=xors2[2*index]^xors2[2*index+1]; } } } void solve() { ll n,m,num,num1,num2,ans; cin>>n>>m; nums.resize(n+1),xors1.resize(4*n+1),xors2.resize(4*n+1); for(int i=1;i<=n;i++) { cin>>nums[i]; } build(1,n,1); for(int i=0;i<m;i++) { cin>>num>>num1>>num2; if(num==2) { if(num1%2==0) { ans=getXor1(1,n,1,num1,num2); } else { ans=getXor2(1,n,1,num1,num2); } cout<<ans<<"\n"; } else { update(1,n,1,num2,num1); } } } int main() { fastIO; ll t=1; //cin>>t; while(t--) { solve(); } }
#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...