#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));
#define FULL (~0ull)
#define NB 470016 /* 7344 * 64 */
#define N1 7344
#define N2 115
#define N3 2
#define N4 1
static uint64_t blk[NB];
static uint64_t fm1[N1], nm1[N1];
static uint64_t fm2[N2], nm2[N2];
static uint64_t fm3[N3], nm3[N3];
static uint64_t fm4[N4], nm4[N4];
static uint64_t *const FM[5] = {0, fm1, fm2, fm3, fm4};
static uint64_t *const NM[5] = {0, nm1, nm2, nm3, nm4};
static const char *P;
static uint64_t O;
static inline int ctz(uint64_t x){ return __builtin_ctzll(x); }
/* ---- point add/sub ---- */
static int point_add(int level, int node, int base, int pos, uint64_t v);
static int point_sub(int level, int node, int base, int pos, uint64_t v);
static int point_add(int level, int node, int base, int pos, uint64_t v){
if (level == 0){
uint64_t old = blk[pos];
uint64_t nv = old + v;
blk[pos] = nv;
return nv < old;
}
int childsz = 1 << (6 * (level - 1));
int c = (pos - base) / childsz;
uint64_t bit = 1ull << c;
int child = node * 64 + c;
if (level == 1){
if (fm1[node] & bit) blk[pos] = FULL;
else if (!(nm1[node] & bit)) blk[pos] = 0;
} else {
if (FM[level][node] & bit){ FM[level-1][child] = ~0ull; NM[level-1][child] = ~0ull; }
else if (!(NM[level][node] & bit)){ FM[level-1][child] = 0; NM[level-1][child] = 0; }
}
int ovf = point_add(level - 1, child, base + c * childsz, pos, v);
int cf, cn;
if (level == 1){ uint64_t b = blk[pos]; cf = (b == FULL); cn = (b != 0); }
else { cf = (FM[level-1][child] == ~0ull); cn = (NM[level-1][child] != 0); }
if (cf) FM[level][node] |= bit; else FM[level][node] &= ~bit;
if (cn) NM[level][node] |= bit; else NM[level][node] &= ~bit;
return ovf;
}
static int point_sub(int level, int node, int base, int pos, uint64_t v){
if (level == 0){
uint64_t old = blk[pos];
uint64_t nv = old - v;
blk[pos] = nv;
return nv > old;
}
int childsz = 1 << (6 * (level - 1));
int c = (pos - base) / childsz;
uint64_t bit = 1ull << c;
int child = node * 64 + c;
if (level == 1){
if (fm1[node] & bit) blk[pos] = FULL;
else if (!(nm1[node] & bit)) blk[pos] = 0;
} else {
if (FM[level][node] & bit){ FM[level-1][child] = ~0ull; NM[level-1][child] = ~0ull; }
else if (!(NM[level][node] & bit)){ FM[level-1][child] = 0; NM[level-1][child] = 0; }
}
int ovf = point_sub(level - 1, child, base + c * childsz, pos, v);
int cf, cn;
if (level == 1){ uint64_t b = blk[pos]; cf = (b == FULL); cn = (b != 0); }
else { cf = (FM[level-1][child] == ~0ull); cn = (NM[level-1][child] != 0); }
if (cf) FM[level][node] |= bit; else FM[level][node] &= ~bit;
if (cn) NM[level][node] |= bit; else NM[level][node] &= ~bit;
return ovf;
}
/* ---- range set ---- */
static void set_range(int level, int node, int base, int l, int r, int v){
int span = 1 << (6 * level);
if (l <= base && base + span - 1 <= r){
if (v == 2){ FM[level][node] = ~0ull; NM[level][node] = ~0ull; }
else { FM[level][node] = 0; NM[level][node] = 0; }
return;
}
if (level == 1){
int cl = (l > base) ? (l - base) : 0;
int cr = (r < base + 63) ? (r - base) : 63;
uint64_t mask = ((1ull << (cr - cl + 1)) - 1) << cl;
if (v == 2){ fm1[node] |= mask; nm1[node] |= mask; }
else { fm1[node] &= ~mask; nm1[node] &= ~mask; }
return;
}
int childsz = span >> 6;
int cl = (l > base) ? ((l - base) / childsz) : 0;
int cr = (r - base) / childsz;
if (cr > 63) cr = 63;
int fl = (base + cl * childsz >= l) ? cl : cl + 1;
int fr = (base + (cr + 1) * childsz - 1 <= r) ? cr : cr - 1;
if (fl <= fr){
uint64_t mask = ((1ull << (fr - fl + 1)) - 1) << fl;
if (v == 2){ FM[level][node] |= mask; NM[level][node] |= mask; }
else { FM[level][node] &= ~mask; NM[level][node] &= ~mask; }
}
int bl = (cl < fl) ? cl : -1;
int br = (cr > fr) ? cr : -1;
if (bl >= 0){
int child = node * 64 + bl;
uint64_t bit = 1ull << bl;
if (FM[level][node] & bit){ FM[level-1][child] = ~0ull; NM[level-1][child] = ~0ull; }
else if (!(NM[level][node] & bit)){ FM[level-1][child] = 0; NM[level-1][child] = 0; }
set_range(level - 1, child, base + bl * childsz, l, r, v);
int cf = (FM[level-1][child] == ~0ull);
int cn = (NM[level-1][child] != 0);
if (cf) FM[level][node] |= bit; else FM[level][node] &= ~bit;
if (cn) NM[level][node] |= bit; else NM[level][node] &= ~bit;
}
if (br >= 0 && br != bl){
int child = node * 64 + br;
uint64_t bit = 1ull << br;
if (FM[level][node] & bit){ FM[level-1][child] = ~0ull; NM[level-1][child] = ~0ull; }
else if (!(NM[level][node] & bit)){ FM[level-1][child] = 0; NM[level-1][child] = 0; }
set_range(level - 1, child, base + br * childsz, l, r, v);
int cf = (FM[level-1][child] == ~0ull);
int cn = (NM[level-1][child] != 0);
if (cf) FM[level][node] |= bit; else FM[level][node] &= ~bit;
if (cn) NM[level][node] |= bit; else NM[level][node] &= ~bit;
}
}
/* ---- find ---- */
static int find_nf(int level, int node, int base, int pos){
if (level == 0) return base;
uint64_t fullmask = FM[level][ node];
int childsz = 1 << (6 * (level - 1));
int c0 = (pos - base) / childsz;
if (c0 < 0) c0 = 0;
if (c0 >= 64) return -1;
uint64_t m = (~fullmask) >> c0;
while (m){
int c = c0 + ctz(m);
int res = find_nf(level - 1, node * 64 + c, base + c * childsz, pos);
if (res != -1) return res;
m &= m - 1;
}
return -1;
}
static int find_nz(int level, int node, int base, int pos){
if (level == 0) return base;
uint64_t nzmask = NM[level][ node];
int childsz = 1 << (6 * (level - 1));
int c0 = (pos - base) / childsz;
if (c0 < 0) c0 = 0;
if (c0 >= 64) return -1;
uint64_t m = nzmask >> c0;
while (m){
int c = c0 + ctz(m);
int res = find_nz(level - 1, node * 64 + c, base + c * childsz, pos);
if (res != -1) return res;
m &= m - 1;
}
return -1;
}
/* ---- query ---- */
static uint64_t get_block(int level, int node, int base, int pos){
if (level == 0) return blk[pos];
int childsz = 1 << (6 * (level - 1));
int c = (pos - base) / childsz;
uint64_t bit = 1ull << c;
if (FM[level][node] & bit) return FULL;
if (!(NM[level][node] & bit)) return 0;
return get_block(level - 1, node * 64 + c, base + c * childsz, pos);
}
/* ---- carry / borrow ---- */
static inline void carry_add(int p){
int j = find_nf(4, 0, 0, p);
if (j < 0) return;
if (j - 1 >= p) set_range(4, 0, 0, p, j - 1, 0);
point_add(4, 0, 0, j, 1);
}
static inline void borrow_sub(int p){
int j = find_nz(4, 0, 0, p);
if (j < 0) return;
if (j - 1 >= p) set_range(4, 0, 0, p, j - 1, 2);
point_sub(4, 0, 0, j, 1);
}
static inline void add_val(int q, int r, uint64_t av){
unsigned __int128 v = (unsigned __int128)av << r;
uint64_t lo = (uint64_t)v;
uint64_t hi = (uint64_t)(v >> 64);
if (point_add(4, 0, 0, q, lo)) carry_add(q + 1);
if (hi && point_add(4, 0, 0, q + 1, hi)) carry_add(q + 2);
}
static inline void sub_val(int q, int r, uint64_t av){
unsigned __int128 v = (unsigned __int128)av << r;
uint64_t lo = (uint64_t)v;
uint64_t hi = (uint64_t)(v >> 64);
if (point_sub(4, 0, 0, q, lo)) borrow_sub(q + 1);
if (hi && point_sub(4, 0, 0, q + 1, hi)) borrow_sub(q + 2);
}
/* ---- parse ---- */
static inline int rd(){
while (*P <= ' ') P++;
int v = 0;
while (*P > ' ') v = v*10 + (*P - '0'), P++;
return v;
}
static inline int rds(){
while (*P <= ' ') P++;
int neg = 0;
if (*P == '-'){ neg = 1; P++; }
int v = 0;
while (*P > ' ') v = v*10 + (*P - '0'), 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;
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;
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 >> 6;
int r = b & 63;
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();
uint64_t bv = get_block(4, 0, 0, k >> 6);
int bit = (int)((bv >> (k & 63)) & 1);
out[O++] = (char)('0' + bit);
out[O++] = '\n';
}
}
done(O, di, out, use_di);
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 7.01 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #2 | 11.6 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #3 | 117.24 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #4 | 176.26 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #5 | 979.05 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #6 | 594.51 us | 28 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #7 | 1.468 ms | 60 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #8 | 1.466 ms | 28 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #9 | 5.053 ms | 152 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #10 | 9.129 ms | 96 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #11 | 8.916 ms | 68 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #12 | 5.946 ms | 304 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #13 | 11.93 ms | 328 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #14 | 34.048 ms | 896 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #15 | 27.067 ms | 1 MB + 308 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #16 | 67.695 ms | 1 MB + 748 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #17 | 78.776 ms | 384 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #18 | 108.648 ms | 2 MB + 600 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #19 | 126.638 ms | 3 MB + 12 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #20 | 42.612 ms | 3 MB + 752 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #21 | 87.034 ms | 3 MB + 888 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #22 | 148.903 ms | 692 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #23 | 188.596 ms | 1 MB + 212 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #24 | 158.913 ms | 736 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #25 | 180.927 ms | 4 MB + 288 KB | Accepted | Score: 4 | 显示更多 |