제출 #1363517

#제출 시각아이디문제언어결과실행 시간메모리
1363517nini_gvenetadzeXORanges (eJOI19_xoranges)C++20
100 / 100
255 ms6472 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
int seg1[4*MAXN], seg2[4*MAXN];
void update1(int ind, int l, int r, int i, int x)
{
    if(r-l==1) {seg1[ind]=x; return; }
    if((l+r)/2>i) update1(ind*2, l, (l+r)/2, i, x);
    else update1(ind*2+1, (l+r)/2, r, i, x);
    seg1[ind]=seg1[ind*2]^seg1[ind*2+1];
}
void update2(int ind, int l, int r, int i, int x)
{
    if(r-l==1) {seg2[ind]=x; return;}
    if((l+r)/2>i) update2(ind*2, l, (l+r)/2, i, x);
    else update2(ind*2+1, (l+r)/2, r, i, x);
    seg2[ind]=seg2[ind*2]^seg2[ind*2+1];
}
int sum1(int ind, int l, int r, int a, int b)
{
    if(a>=r || b<=l) return 0;
    if(l>=a && r<=b) return seg1[ind];
    int s1=sum1(ind*2, l, (l+r)/2, a, b);
    int s2=sum1(ind*2+1, (l+r)/2, r, a, b);
    return s1^s2;

}
int sum2(int ind, int l, int r, int a, int b)
{
    if(a>=r || b<=l) return 0;
    if(l>=a && r<=b) return seg2[ind];
    int s1=sum2(ind*2, l, (l+r)/2, a, b);
    int s2=sum2(ind*2+1, (l+r)/2, r, a, b);
    return s1^s2;
}
int main()
{
    int n, q;
    cin>>n>>q;
    vector<int> a(n+1);
    for(int i=1; i<=n; i++ )
    {
        cin>>a[i];
        if(i%2==1) update1(1, 1, n+1, i, a[i]);
        else update2(1, 1, n+1, i, a[i]);

        
    }
    for(int i=0; i<q; i++)
    {
        int a, b, c;
        cin>>a>>b>>c;
        if(a==1)
        {
            if(b%2==1) update1(1, 1, n+1, b, c);
            else update2(1,1, n+1, b, c);
        }
        else
        if(a==2)
        {
          if((c-b+1)%2==0) {cout<<"0"<<endl;  continue;}
          int ans=0;
          if(b%2==1) {ans=sum1(1, 1, n+1, b, c+1);}
          else {ans=sum2(1, 1, n+1, b, c+1);}
          cout<<ans<<endl;
        }
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…