本题使用vector
的代码:
#include <bits/stdc++.h>
#ifdef _WIN32
#define getchar_unlocked getchar
#define putchar_unlocked putchar
#else
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#endif
// #define x first
// #define y second
#define set(arr,val) memset((arr),(val),sizeof(arr))
constexpr signed L=2*1e5+10; // L!=1e9+10
typedef long long LL;
// typedef unsigned long long ULL;
// typedef std::pair<signed,signed> PII;
// typedef std::priority_queue<signed,std::vector<signed>,std::greater<signed> > P_Q;
// typedef std::priority_queue<signed,std::vector<signed>,std::less<signed> > _P_Q;
// typedef __int128 INT
// constexpr signed L=;
// constexpr signed M=;
// #include <numbers> // only in C++20
constexpr signed inf=0x3f3f3f3f;
constexpr signed err=-1;
constexpr double eps=1e-8;
const double pi=acos(-1.0);
constexpr signed dx[]={0, 0, 1,-1, 1, 1,-1,-1};
constexpr signed dy[]={1,-1, 0, 0, 1,-1,-1, 1};
// constexpr LL mod=1e9+7;
using namespace std;
template<typename T>
void debug(string name="(NaN)",vector<T> v={-1})
{
cout<<"\n***"<<name<<"***\n";
for(typename vector<T>::const_iterator it=v.begin();it!=v.end();it++)
cout<<*it<<' ';
cout<<"\n****************\n";
}
inline LL read()
{
signed f=1;
LL x=0;
char c=getchar_unlocked();
while(c<'0'||c>'9')
{
if(c=='-')
f=-1;
c=getchar_unlocked();
}
while('0'<=c&&c<='9')
{
x=(x<<3)+(x<<1)+(c^48);
c=getchar_unlocked();
}
return f*x;
}
inline void _write(LL x)
{
if(x<0)
{
putchar_unlocked('-');
x=-x;
}
if(x>9)
_write(x/10);
putchar_unlocked(x%10+'0');
return;
}
inline void write(LL x,short op=0)// op>0:x+Space;op==0:x+endl;op<0:x.
{
_write(x);
if(op==0)
putchar_unlocked('\n');
else if(op>0)
putchar_unlocked(' ');
return;
}
inline void write_s(string dat)
{
signed len=dat.size();
for(signed i=0;i<len;i++)
putchar_unlocked(dat[i]);
}
signed n,q;
vector<signed> num;
inline signed lowbit(signed x)
{
return x&(-x);
}
struct BIT
{
signed dat[L];
inline void update(signed x,signed p)
{
for(;p<=n;p+=lowbit(p))
dat[p]^=x;
}
inline signed xor_sum(signed p)
{
signed ans=0;
for(;p;p-=lowbit(p))
ans^=dat[p];
return ans;
}
} bit[2];
// #define CONSOLE_DEBUG
#define FILENAME "xor"
signed main()
{
#ifndef ONLINE_JUDGE
#ifndef CONSOLE_DEBUG
freopen(FILENAME".in","r",stdin);
freopen(FILENAME".out","w",stdout);
#endif
#endif
n=read(),q=read();
for(signed i=0;i<n;i++)
{
num.emplace_back(read());
bit[i&1].update(num[i],i);
}
while(q--)
{
signed op=read(),p=read(),q=read();
if(op==1)
{
bit[p&1].update(num[p]^q,p);
num[p]=q;
}
else
{
if((p+q)&1)
putchar('0'),putchar('\n');
else
write(bit[p&1].xor_sum(q)^bit[p&1].xor_sum(p-1));
}
}
return 0;
}
结果TLE, 0pts.
而将vector
改为普通数组后, AC 100pts.
求原因.