由经典的NIM问题可知异或和非零必胜,但每次操作求异或和复杂度过高。问题关键在于变数操作可以转换为异或操作,异或值b=原值现值,由异或的结合律即可提出b,原异或和b就是结果。
AC代码:
#include <iostream>
using namespace std;
typedef long long ll;
const int N=100005;
ll a[N];
//操作可以转换为异或运算
int main(){
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ll sg=0;
for(int i=1;i<=n;i++){
sg=sg^a[i];
}
for(int i=1;i<=q;i++){
int x;ll y;
cin>>x>>y;
sg=sg^(a[x]^y);
a[x]=y;
if(sg){
cout<<"Kan"<<endl;
}else{
cout<<"Li"<<endl;
}
}
return 0;
}