0からNまでの累積XORやAからBまでの区間XORについて

ここでは、0からNまでの累積XORを0\oplus1\oplus2\oplus...\oplus Nと定義します。
たとえば、Nが0から15までの各累積XORはこのようになります。

N(10進表記) N(2進表記) 累積XOR
0 0000 0000
1 0001 0001
2 0010 0011
3 0011 0000
4 0100 0100
5 0101 0001
6 0110 0111
7 0111 0000
8 1000 1000
9 1001 0001
10 1010 1011
11 1011 0000
12 1100 1100
13 1101 0001
14 1110 1111
15 1111 0000

累積XORには周期4の規則性があります。
数字Nを4で割った余りrに注目すると、このようになります。

余りr 累積XOR
0 N
1 1
2 N+1
3 0

この事実を利用すると、aからbまでの区間XORをa\oplus(a+1)\oplus...\oplus bと定義し、f(a,b)と表記したとき
x\oplus x=0であることも利用すると、f(a,b)=f(0,a-1)\oplus f(0,b)として計算することができます。
たとえば、f(2,4)=f(0,1)\oplus f(0,4)=0\oplus1\oplus0\oplus1\oplus2\oplus3\oplus4=0\oplus0\oplus1\oplus1\oplus2\oplus3\oplus4=2\oplus3\oplus4となります。

long a,b;
long f(long n){
  if(n<0)return 0;
  switch(n%4){
    case 0:return n;
    case 1:return 1;
    case 2:return n+1;
    case 3:return 0;
  }
}
inline void solve(void){
  in(a,b);
  out(f(a-1)^f(b));
}