Submission #465075

#TimeUsernameProblemLanguageResultExecution timeMemory
465075oscar1fXORanges (eJOI19_xoranges)C++17
100 / 100
960 ms8148 KiB
#include<bits/stdc++.h> using namespace std; const int DECA=(1<<17),NB_BITS=32; int nbOrange,nbReq,typeReq,posNouv,resNouv,deb,fin,rep; int arbreBinP[2*DECA],arbreBinI[2*DECA],multi[NB_BITS]; int calc_xor(int a,int b) { int res=0; for (int i=0;i<NB_BITS;i++) { if (a%2!=b%2) { res+=multi[i]; } a/=2; b/=2; } return res; } void remonteeP(int pos) { if (pos!=0) { arbreBinP[pos]=calc_xor(arbreBinP[pos*2],arbreBinP[pos*2+1]); remonteeP(pos/2); } } void remonteeI(int pos) { if (pos!=0) { arbreBinI[pos]=calc_xor(arbreBinI[pos*2],arbreBinI[pos*2+1]); remonteeI(pos/2); } } void calcInterP(int debInter,int finInter) { if (debInter==finInter) { rep=calc_xor(rep,arbreBinP[debInter]); } else if (debInter%2==1) { rep=calc_xor(rep,arbreBinP[debInter]); calcInterP(debInter+1,finInter); } else if (finInter%2==0) { rep=calc_xor(rep,arbreBinP[finInter]); calcInterP(debInter,finInter-1); } else { calcInterP(debInter/2,finInter/2); } } void calcInterI(int debInter,int finInter) { if (debInter==finInter) { rep=calc_xor(rep,arbreBinI[debInter]); } else if (debInter%2==1) { rep=calc_xor(rep,arbreBinI[debInter]); calcInterI(debInter+1,finInter); } else if (finInter%2==0) { rep=calc_xor(rep,arbreBinI[finInter]); calcInterI(debInter,finInter-1); } else { calcInterI(debInter/2,finInter/2); } } int main() { ios_base::sync_with_stdio(false); cin>>nbOrange>>nbReq; multi[0]=1; for (int i=1;i<NB_BITS;i++) { multi[i]=multi[i-1]*2; } for (int i=0;i<nbOrange;i++) { if (i%2==0) { cin>>arbreBinP[DECA+i/2]; } else { cin>>arbreBinI[DECA+i/2]; } } for (int i=DECA-1;i>0;i--) { arbreBinP[i]=calc_xor(arbreBinP[2*i],arbreBinP[2*i+1]); arbreBinI[i]=calc_xor(arbreBinI[2*i],arbreBinI[2*i+1]); } for (int i=0;i<nbReq;i++) { cin>>typeReq; if (typeReq==1) { cin>>posNouv>>resNouv; posNouv--; if (posNouv%2==0) { arbreBinP[DECA+posNouv/2]=resNouv; remonteeP((DECA+posNouv/2)/2); } else { arbreBinI[DECA+posNouv/2]=resNouv; remonteeI((DECA+posNouv/2)/2); } } else { cin>>deb>>fin; deb--; fin--; if ((fin-deb+1)%2==0) { cout<<0<<endl; } else { rep=0; if (deb%2==0) { calcInterP(DECA+deb/2,DECA+fin/2); } else { calcInterI(DECA+deb/2,DECA+fin/2); } cout<<rep<<endl; } } } 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...