Submission #925523

#TimeUsernameProblemLanguageResultExecution timeMemory
925523Sputnik123XORanges (eJOI19_xoranges)C++14
100 / 100
108 ms12552 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <functional>
#include <cstdio>
#define pb push_back
#define in insert
#define pll pair<ll,ll>
#define vpl vector<pll>
#define vll vector <ll>
#define vl vector<ll>
///#define mp make_pair
#define F first
#define S second
#define all(v) v.begin(),v.end()
#define endl "\n"
#define ll long long 
#define ull unsigned long long
using namespace std;
using namespace __gnu_pbds;
//  #pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt,fma")
const ll sz=2e5+5;
const ll inf=1e12+7;
const ll mod=1e9+7;
const ll P=47;
///const double e=1e-6;
ll gcd(ll x,ll y)
{
    return (y ? gcd(y,x%y) : x);
}
ll lcm(ll x,ll y)
{
    return (x/gcd(x,y))*y;
}
ll binpow(ll a,ll b)
{
    ll ans=1;
    a%=mod;
    while(b)
    {
        ans=(b&1 ? (ans*a)%mod : ans);
        a=(a*a)%mod;
        b>>=1;
    }
    return ans;
}
ll modm(ll n,ll m,ll md=mod)
{
    if(!m)  return 1;
    ll res=modm(n,m>>1,md);
    if(m&1) return res*res%md*n%md;
    return res*res%md;
}
bool isprime(ll n){
    if(n<3)    return false;
    for(ll i=2;i<=sqrt(n);i++){
        if(n%i==0)  return  false;
    }
    return true;
}
ll n,q,cur;
ll a[sz],t[sz<<2],d[sz],na[sz];
void build(ll node,ll l,ll r)
{
    if(l==r)
    {
        t[node]=na[l];
        return ;
    }
    ll mid=(l+r)>>1;
    build(node<<1,l,mid);
    build(node<<1|1,mid+1,r);
    t[node]=((t[node<<1])^(t[node<<1|1]));
}
void update(ll node,ll l,ll r,ll pos,ll val)
{
    if(l==r and l==pos)
    {
        t[node]=val;
        na[l]=val;
        return ;
    }
    ll mid=(l+r)>>1;
    if(pos<=mid)
        update(node<<1,l,mid,pos,val);
    else
        update(node<<1|1,mid+1,r,pos,val);
    t[node]=((t[node<<1])^(t[node<<1|1]));
}
ll get(ll node,ll l,ll r,ll ql,ll qr)
{
    if(l>qr || r<ql)    return 0;
    if(ql<=l and r<=qr) return t[node];
    ll mid=(l+r)>>1;
    return (get(node<<1,l,mid,ql,qr))^(get(node<<1|1,mid+1,r,ql,qr));
}
void solve()
{
    cin>>n>>q;
    for(ll i=1;i<=n;i++)
        cin>>a[i];
    for(ll i=1;i<=n;i+=2)
    {
        d[i]=++cur;
        na[cur]=a[i];
    }
    for(ll i=2;i<=n;i+=2)
    {
        d[i]=++cur;
        na[cur]=a[i];
    }
    build(1,1,n);
    while(q--)
    {
        ll ta,l,r;
        cin>>ta>>l>>r;
        if(ta==1)
        {
            update(1,1,n,d[l],r);
        }
        else
        {
            if((r-l+1)%2==0){    cout<<0<<endl;continue; }
            else                cout<<get(1,1,n,d[l],d[r])<<endl;
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    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...