#include <stdint.h>
#include <sys/auxv.h>
#include <unistd.h>
struct DuckInfo {
uint64_t abi_version;
const char *stdin_ptr; uint64_t stdin_size;
char *stdout_ptr; uint64_t stdout_limit; uint64_t stdout_size;
char *stderr_ptr; uint64_t stderr_limit; uint64_t stderr_size;
const char *IB_ptr; uint64_t IB_limit;
char *OB_ptr; uint64_t OB_limit;
uint64_t tsc_frequency;
} __attribute__((packed));
typedef unsigned __int128 u128;
#define FULL ((u128)-1)
#define NB 234496
#define N1 3664
#define N2 58
static u128 blk[NB];
static uint64_t fm1[N1], nm1[N1];
static uint64_t fm2[N2], nm2[N2];
static uint64_t fm3, nm3;
static const char *P;
static uint64_t O;
static inline int ctz(uint64_t x){ return __builtin_ctzll(x); }
/* ---- point add / sub ---- */
static inline int point_add(int pos, u128 v){
int l2 = pos >> 12;
int l1 = pos >> 6;
{
uint64_t b = 1ull << l2;
if (fm3 & b){ fm2[l2] = ~0ull; nm2[l2] = ~0ull; }
else if (!(nm3 & b)){ fm2[l2] = 0; nm2[l2] = 0; }
}
{
uint64_t b = 1ull << (l1 & 63);
if (fm2[l2] & b){ fm1[l1] = ~0ull; nm1[l1] = ~0ull; }
else if (!(nm2[l2] & b)){ fm1[l1] = 0; nm1[l1] = 0; }
}
{
uint64_t b = 1ull << (pos & 63);
if (fm1[l1] & b) blk[pos] = FULL;
else if (!(nm1[l1] & b)) blk[pos] = 0;
}
u128 old = blk[pos];
u128 nv = old + v;
blk[pos] = nv;
int ovf = nv < old;
{
uint64_t b = 1ull << (pos & 63);
if (nv == FULL) fm1[l1] |= b; else fm1[l1] &= ~b;
if (nv != 0) nm1[l1] |= b; else nm1[l1] &= ~b;
}
{
uint64_t b = 1ull << (l1 & 63);
if (fm1[l1] == ~0ull) fm2[l2] |= b; else fm2[l2] &= ~b;
if (nm1[l1] != 0) nm2[l2] |= b; else nm2[l2] &= ~b;
}
{
uint64_t b = 1ull << l2;
if (fm2[l2] == ~0ull) fm3 |= b; else fm3 &= ~b;
if (nm2[l2] != 0) nm3 |= b; else nm3 &= ~b;
}
return ovf;
}
static inline int point_sub(int pos, u128 v){
int l2 = pos >> 12;
int l1 = pos >> 6;
{
uint64_t b = 1ull << l2;
if (fm3 & b){ fm2[l2] = ~0ull; nm2[l2] = ~0ull; }
else if (!(nm3 & b)){ fm2[l2] = 0; nm2[l2] = 0; }
}
{
uint64_t b = 1ull << (l1 & 63);
if (fm2[l2] & b){ fm1[l1] = ~0ull; nm1[l1] = ~0ull; }
else if (!(nm2[l2] & b)){ fm1[l1] = 0; nm1[l1] = 0; }
}
{
uint64_t b = 1ull << (pos & 63);
if (fm1[l1] & b) blk[pos] = FULL;
else if (!(nm1[l1] & b)) blk[pos] = 0;
}
u128 old = blk[pos];
u128 nv = old - v;
blk[pos] = nv;
int ovf = nv > old;
{
uint64_t b = 1ull << (pos & 63);
if (nv == FULL) fm1[l1] |= b; else fm1[l1] &= ~b;
if (nv != 0) nm1[l1] |= b; else nm1[l1] &= ~b;
}
{
uint64_t b = 1ull << (l1 & 63);
if (fm1[l1] == ~0ull) fm2[l2] |= b; else fm2[l2] &= ~b;
if (nm1[l1] != 0) nm2[l2] |= b; else nm2[l2] &= ~b;
}
{
uint64_t b = 1ull << l2;
if (fm2[l2] == ~0ull) fm3 |= b; else fm3 &= ~b;
if (nm2[l2] != 0) nm3 |= b; else nm3 &= ~b;
}
return ovf;
}
/* ---- find (top-down, unrolled, 3 levels) ---- */
static inline int find_nf(int pos){
int l2 = pos >> 12, l1 = pos >> 6, off = pos & 63;
uint64_t m3 = ~fm3 >> l2;
while (m3){
int l2n = l2 + ctz(m3);
uint64_t b3 = 1ull << l2n;
if (!(nm3 & b3)) return (l2n > l2) ? (l2n << 12) : pos;
int c2 = (l2n == l2) ? (l1 & 63) : 0;
uint64_t m2 = ~fm2[l2n] >> c2;
while (m2){
int c2r = c2 + ctz(m2);
uint64_t b2 = 1ull << c2r;
int l1n = (l2n << 6) + c2r;
if (!(nm2[l2n] & b2)){
int st = l1n << 6;
return (st > pos) ? st : pos;
}
int c1 = (l1n == l1) ? off : 0;
uint64_t m1 = ~fm1[l1n] >> c1;
if (m1) return (l1n << 6) + c1 + ctz(m1);
m2 &= m2 - 1;
}
m3 &= m3 - 1;
}
return -1;
}
static inline int find_nz(int pos){
int l2 = pos >> 12, l1 = pos >> 6, off = pos & 63;
uint64_t m3 = nm3 >> l2;
while (m3){
int l2n = l2 + ctz(m3);
uint64_t b3 = 1ull << l2n;
if (fm3 & b3) return (l2n > l2) ? (l2n << 12) : pos;
int c2 = (l2n == l2) ? (l1 & 63) : 0;
uint64_t m2 = nm2[l2n] >> c2;
while (m2){
int c2r = c2 + ctz(m2);
uint64_t b2 = 1ull << c2r;
int l1n = (l2n << 6) + c2r;
if (fm2[l2n] & b2){
int st = l1n << 6;
return (st > pos) ? st : pos;
}
int c1 = (l1n == l1) ? off : 0;
uint64_t m1 = nm1[l1n] >> c1;
if (m1) return (l1n << 6) + c1 + ctz(m1);
m2 &= m2 - 1;
}
m3 &= m3 - 1;
}
return -1;
}
/* ---- set_range (3 levels) ---- */
static inline void __attribute__((always_inline)) upd_l2(int l2){
uint64_t b = 1ull << l2;
if (fm2[l2] == ~0ull) fm3 |= b; else fm3 &= ~b;
if (nm2[l2] != 0) nm3 |= b; else nm3 &= ~b;
}
static inline void __attribute__((always_inline)) set_r1(int l1, int cl, int cr, int v){
uint64_t mask = (~0ull >> (64 - (cr - cl + 1))) << cl;
if (v == 2){ fm1[l1] |= mask; nm1[l1] |= mask; }
else { fm1[l1] &= ~mask; nm1[l1] &= ~mask; }
int l2 = l1 >> 6;
uint64_t b2 = 1ull << (l1 & 63);
if (fm1[l1] == ~0ull) fm2[l2] |= b2; else fm2[l2] &= ~b2;
if (nm1[l1] != 0) nm2[l2] |= b2; else nm2[l2] &= ~b2;
}
static inline void __attribute__((always_inline)) set_r2(int l2, int l, int r, int v){
int l1l = l >> 6, l1r = r >> 6;
if (l1l == l1r){ set_r1(l1l, l & 63, r & 63, v); upd_l2(l2); return; }
int fl = ((l & 63) == 0) ? l1l : l1l + 1;
int fr = ((r & 63) == 63) ? l1r : l1r - 1;
if (fl <= fr){
uint64_t mask = (~0ull >> (64 - (fr - fl + 1))) << fl;
if (v == 2){ fm2[l2] |= mask; nm2[l2] |= mask; }
else { fm2[l2] &= ~mask; nm2[l2] &= ~mask; }
}
if (fl > l1l) set_r1(l1l, l & 63, 63, v);
if (fr < l1r) set_r1(l1r, 0, r & 63, v);
upd_l2(l2);
}
static inline void __attribute__((always_inline)) set_range(int l, int r, int v){
if (l > r) return;
int l2l = l >> 12, l2r = r >> 12;
if (l2l == l2r){ set_r2(l2l, l, r, v); return; }
int fl = ((l & 4095) == 0) ? l2l : l2l + 1;
int fr = ((r & 4095) == 4095) ? l2r : l2r - 1;
if (fl <= fr){
uint64_t mask = (~0ull >> (64 - (fr - fl + 1))) << fl;
if (v == 2){ fm3 |= mask; nm3 |= mask; }
else { fm3 &= ~mask; nm3 &= ~mask; }
}
if (fl > l2l) set_r2(l2l, l, (l2l + 1) * 4096 - 1, v);
if (fr < l2r) set_r2(l2r, l2r * 4096, r, v);
}
/* ---- carry / borrow ---- */
static inline void carry_add(int p){
int j = find_nf(p);
if (j < 0) return;
if (j - 1 >= p) set_range(p, j - 1, 0);
point_add(j, (u128)1);
}
static inline void borrow_sub(int p){
int j = find_nz(p);
if (j < 0) return;
if (j - 1 >= p) set_range(p, j - 1, 2);
point_sub(j, (u128)1);
}
static inline void add_val(int q, int r, uint64_t av){
u128 lo = (u128)av << r;
uint64_t hi = 0;
if (r >= 99) hi = av >> (128 - r);
if (point_add(q, lo)) carry_add(q + 1);
if (hi && point_add(q + 1, (u128)hi)) carry_add(q + 2);
}
static inline void sub_val(int q, int r, uint64_t av){
u128 lo = (u128)av << r;
uint64_t hi = 0;
if (r >= 99) hi = av >> (128 - r);
if (point_sub(q, lo)) borrow_sub(q + 1);
if (hi && point_sub(q + 1, (u128)hi)) borrow_sub(q + 2);
}
/* ---- parse ---- */
static const char *PEND;
static inline int rd(){
const char *p = P;
while (*p <= ' ') p++;
int v = 0;
while (p + 4 <= PEND){
uint32_t x;
__builtin_memcpy(&x, p, 4);
if ((x & 0xF0F0F0F0u) != 0x30303030u) break;
uint32_t lo = x & 0x0F0F0F0Fu;
if (((lo + 0x06060606u) & 0xF0F0F0F0u) != 0) break;
x -= 0x30303030u;
v = v*10000 + (int)(x & 0xff)*1000 + (int)((x>>8)&0xff)*100 + (int)((x>>16)&0xff)*10 + (int)((x>>24)&0xff);
p += 4;
}
while (*p > ' ') v = v*10 + (*p - '0'), p++;
P = p;
return v;
}
static inline int rds(){
const char *p = P;
while (*p <= ' ') p++;
int neg = 0;
if (*p == '-'){ neg = 1; p++; }
int v = 0;
while (p + 4 <= PEND){
uint32_t x;
__builtin_memcpy(&x, p, 4);
if ((x & 0xF0F0F0F0u) != 0x30303030u) break;
uint32_t lo = x & 0x0F0F0F0Fu;
if (((lo + 0x06060606u) & 0xF0F0F0F0u) != 0) break;
x -= 0x30303030u;
v = v*10000 + (int)(x & 0xff)*1000 + (int)((x>>8)&0xff)*100 + (int)((x>>16)&0xff)*10 + (int)((x>>24)&0xff);
p += 4;
}
while (*p > ' ') v = v*10 + (*p - '0'), p++;
P = p;
return neg ? -v : v;
}
__attribute__((noreturn)) static void done(uint64_t olen, struct DuckInfo *di, char *out, int use_di){
if (use_di) di->stdout_size = olen;
else (void)!write(1, out, olen);
asm volatile("mov $60, %%eax; xor %%edi, %%edi; syscall" ::: "rax","rdi","memory");
__builtin_unreachable();
}
int main(){
struct DuckInfo *di = (struct DuckInfo*)getauxval(0x6b637564);
static char lbuf[1<<24];
static char obuf[1<<22];
char *out;
int use_di = 0;
if (di && di->abi_version >= 1 && di->stdin_ptr && di->stdout_ptr){
P = di->stdin_ptr;
PEND = di->stdin_ptr + di->stdin_size;
out = di->stdout_ptr;
use_di = 1;
} else {
long n2 = 0, t;
while (n2 < (long)sizeof(lbuf) && (t = read(0, lbuf + n2, sizeof(lbuf) - n2)) > 0) n2 += t;
lbuf[n2] = 0;
P = lbuf;
PEND = lbuf + n2;
out = obuf;
}
int n = rd();
rd(); rd(); rd();
for (int i = 0; i < n; i++){
int op = rd();
if (op == 1){
int a = rds();
int b = rd();
int q = b >> 7;
int r = b & 127;
if (a > 0) add_val(q, r, (uint64_t)a);
else if (a < 0) sub_val(q, r, (uint64_t)(-(int64_t)a));
} else {
int k = rd();
int q = k >> 7;
int r = k & 127;
/* get actual bit */
uint64_t v;
{
int l2 = q >> 12, l1 = q >> 6;
uint64_t b3 = 1ull << l2;
if (fm3 & b3) v = 1;
else if (!(nm3 & b3)) v = 0;
else {
uint64_t b2 = 1ull << (l1 & 63);
if (fm2[l2] & b2) v = 1;
else if (!(nm2[l2] & b2)) v = 0;
else {
uint64_t b1 = 1ull << (q & 63);
if (fm1[l1] & b1) v = 1;
else if (!(nm1[l1] & b1)) v = 0;
else v = (uint64_t)((blk[q] >> r) & 1);
}
}
}
out[O++] = (char)('0' + (v & 1));
out[O++] = '\n';
}
}
done(O, di, out, use_di);
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 8.25 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #2 | 10.5 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #3 | 53.95 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #4 | 92.15 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #5 | 234.95 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #6 | 207.5 us | 28 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #7 | 437.31 us | 60 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #8 | 411.24 us | 28 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #9 | 1.523 ms | 152 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #10 | 2.586 ms | 92 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #11 | 2.653 ms | 68 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #12 | 2.254 ms | 300 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #13 | 3.645 ms | 320 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #14 | 10.47 ms | 880 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #15 | 10.028 ms | 1 MB + 292 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #16 | 21.4 ms | 1 MB + 724 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #17 | 21.668 ms | 380 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #18 | 32.363 ms | 2 MB + 560 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #19 | 37.908 ms | 2 MB + 996 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #20 | 22.807 ms | 3 MB + 712 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #21 | 31.471 ms | 3 MB + 832 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #22 | 43.067 ms | 688 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #23 | 47.891 ms | 1 MB + 196 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #24 | 47.493 ms | 732 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #25 | 52.182 ms | 4 MB + 228 KB | Accepted | Score: 4 | 显示更多 |