显示原始代码
#include <cstdio>
#include <cstdlib>
using namespace std;
#define MAXNUM (1 << 30)
#define MAX (1 << 28) + 1
#define CMAX 30
int ans = 0;
char num[MAX], bj[MAX];
bool find(char *a, int n) {
int i = n / 8, j = n % 8;
bool k;
k = a[i] & (1 << j);
return k;
}
void change(char *a, int n) {
int i = n / 8, j = n % 8;
a[i] ^= (1 << j);
}
void work1()
{
int cen = 0, p = 0;
bool x1, x2;
while (cen < 30) {
p = (p << 1) + 1;
if (find(num, p) != find(num, p + 1)) {
ans ^= (1 << cen);
change(num, p);
change(num, p + 1);
}
change(bj, p);
change(bj, p + 1);
if (find(bj, p))
p++;
cen++;
}
printf("%d\n", ans);
}
void work2()
{
int x, i, p, cen;
scanf("%d", &x);
p = 0;
cen = 0;
while (cen < 30) {
i = x & 1;
x >>= 1;
p = (p << 1) + 1;
if (i) {
if (!find(bj, p))
p++;
change(num, p);
ans ^= (1 << cen);
} else {
if (find(bj, p))
p++;
change(num, p);
}
cen++;
}
printf("%d\n", ans);
}
void read() {
int n, i, j;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &j);
if (j == 1)
work1();
else
work2();
}
}
void init() {
char x = 0x55;
for (int i = 0; i < MAX; i++) {
bj[i] = x;
}
}
int main() {
init();
read();
}