#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 NL (524288)
#define N1 ((NL+63)>>6) /* 7813 */
#define N2 (N1>>6) /* 256 */
#define N3 (N2>>6) /* 4 */
#define MASK 0x0FFFFFFFFFFFFFFFull /* 2^60-1 */
#define FULL MASK
static uint64_t limb[NL];
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, nm4;
static const char *P;
static uint64_t O;
static inline int ctz(uint64_t x){ return __builtin_ctzll(x); }
static inline void bubble_l3(int l3){
uint64_t b = 1ull << l3;
if (fm3[l3] == ~0ull) fm4 |= b; else fm4 &= ~b;
if (nm3[l3] != 0) nm4 |= b; else nm4 &= ~b;
}
static inline void bubble_l2(int l2){
uint64_t b = 1ull << (l2 & 63);
int l3 = l2 >> 6;
if (fm2[l2] == ~0ull) fm3[l3] |= b; else fm3[l3] &= ~b;
if (nm2[l2] != 0) nm3[l3] |= b; else nm3[l3] &= ~b;
bubble_l3(l3);
}
static inline void bubble_l1(int l1){
uint64_t b = 1ull << (l1 & 63);
int l2 = l1 >> 6;
if (fm1[l1] == ~0ull) fm2[l2] |= b; else fm2[l2] &= ~b;
if (nm1[l1] != 0) nm2[l2] |= b; else nm2[l2] &= ~b;
bubble_l2(l2);
}
/* materialize L1 word l1 (make fm1[l1]/nm1[l1] authoritative) */
static inline void materialize_word(int l1){
int l2 = l1 >> 6, l3 = l2 >> 6;
uint64_t b3 = 1ull << l3;
if (fm4 & b3){ fm3[l3] = ~0ull; nm3[l3] = ~0ull; }
else if (!(nm4 & b3)){ fm3[l3] = 0; nm3[l3] = 0; }
uint64_t b2 = 1ull << (l2 & 63);
if (fm3[l3] & b2){ fm2[l2] = ~0ull; nm2[l2] = ~0ull; }
else if (!(nm3[l3] & b2)){ fm2[l2] = 0; nm2[l2] = 0; }
uint64_t b1 = 1ull << (l1 & 63);
if (fm2[l2] & b1){ fm1[l1] = ~0ull; nm1[l1] = ~0ull; }
else if (!(nm2[l2] & b1)){ fm1[l1] = 0; nm1[l1] = 0; }
}
static inline int point_add(int pos, uint64_t v){
int l1 = pos >> 6;
materialize_word(l1);
uint64_t b = 1ull << (pos & 63);
uint64_t old;
if (fm1[l1] & b) old = FULL;
else if (!(nm1[l1] & b)) old = 0;
else old = limb[pos];
uint64_t nv = old + v;
int ovf = nv >> 60;
uint64_t n30 = nv & MASK;
limb[pos] = n30;
if (n30 == FULL) fm1[l1] |= b; else fm1[l1] &= ~b;
if (n30 != 0) nm1[l1] |= b; else nm1[l1] &= ~b;
bubble_l1(l1);
return ovf;
}
static inline int point_sub(int pos, uint64_t v){
int l1 = pos >> 6;
materialize_word(l1);
uint64_t b = 1ull << (pos & 63);
uint64_t old;
if (fm1[l1] & b) old = FULL;
else if (!(nm1[l1] & b)) old = 0;
else old = limb[pos];
int64_t nv = (int64_t)old - (int64_t)v;
int borrow = nv < 0;
uint64_t res = borrow ? (uint64_t)(nv + (1ull<<60)) : (uint64_t)nv;
limb[pos] = res;
if (res == FULL) fm1[l1] |= b; else fm1[l1] &= ~b;
if (res != 0) nm1[l1] |= b; else nm1[l1] &= ~b;
bubble_l1(l1);
return borrow;
}
static inline int find_nonfull(int p){
int l1 = p >> 6, l2 = p >> 12, l3 = p >> 18, off = p & 63;
materialize_word(l1);
uint64_t m1 = ~fm1[l1] >> off;
if (m1) return (l1 << 6) + off + ctz(m1);
int sh2 = (l1 & 63) + 1;
uint64_t m2 = (sh2 == 64) ? 0 : (~fm2[l2] >> sh2);
if (m2){
int l1n = (l2 << 6) + sh2 + ctz(m2);
uint64_t b = 1ull << (l1n & 63);
if (fm2[l2] & b){ fm1[l1n] = ~0ull; nm1[l1n] = ~0ull; }
else if (!(nm2[l2] & b)){ fm1[l1n] = 0; nm1[l1n] = 0; }
return (l1n << 6) + ctz(~fm1[l1n]);
}
int sh3 = (l2 & 63) + 1;
uint64_t m3 = (sh3 == 64) ? 0 : (~fm3[l3] >> sh3);
if (m3){
int l2n = (l3 << 6) + sh3 + ctz(m3);
uint64_t b2 = 1ull << (l2n & 63);
if (fm3[l3] & b2){ fm2[l2n] = ~0ull; nm2[l2n] = ~0ull; }
else if (!(nm3[l3] & b2)){ fm2[l2n] = 0; nm2[l2n] = 0; }
int r2 = ctz(~fm2[l2n]);
int l1n = (l2n << 6) + r2;
uint64_t b1 = 1ull << (l1n & 63);
if (fm2[l2n] & b1){ fm1[l1n] = ~0ull; nm1[l1n] = ~0ull; }
else if (!(nm2[l2n] & b1)){ fm1[l1n] = 0; nm1[l1n] = 0; }
return (l1n << 6) + ctz(~fm1[l1n]);
}
uint64_t m4 = ~fm4 >> (l3 + 1);
if (m4){
int l3n = l3 + 1 + ctz(m4);
uint64_t b3 = 1ull << l3n;
if (fm4 & b3){ fm3[l3n] = ~0ull; nm3[l3n] = ~0ull; }
else if (!(nm4 & b3)){ fm3[l3n] = 0; nm3[l3n] = 0; }
int r3 = ctz(~fm3[l3n]);
int l2n = (l3n << 6) + r3;
uint64_t b2 = 1ull << (l2n & 63);
if (fm3[l3n] & b2){ fm2[l2n] = ~0ull; nm2[l2n] = ~0ull; }
else if (!(nm3[l3n] & b2)){ fm2[l2n] = 0; nm2[l2n] = 0; }
int r2 = ctz(~fm2[l2n]);
int l1n = (l2n << 6) + r2;
uint64_t b1 = 1ull << (l1n & 63);
if (fm2[l2n] & b1){ fm1[l1n] = ~0ull; nm1[l1n] = ~0ull; }
else if (!(nm2[l2n] & b1)){ fm1[l1n] = 0; nm1[l1n] = 0; }
return (l1n << 6) + ctz(~fm1[l1n]);
}
return NL;
}
static inline int find_nonzero(int p){
int l1 = p >> 6, l2 = p >> 12, l3 = p >> 18, off = p & 63;
materialize_word(l1);
uint64_t m1 = nm1[l1] >> off;
if (m1) return (l1 << 6) + off + ctz(m1);
int sh2 = (l1 & 63) + 1;
uint64_t m2 = (sh2 == 64) ? 0 : (nm2[l2] >> sh2);
if (m2){
int l1n = (l2 << 6) + sh2 + ctz(m2);
uint64_t b = 1ull << (l1n & 63);
if (fm2[l2] & b){ fm1[l1n] = ~0ull; nm1[l1n] = ~0ull; }
else if (!(nm2[l2] & b)){ fm1[l1n] = 0; nm1[l1n] = 0; }
return (l1n << 6) + ctz(nm1[l1n]);
}
int sh3 = (l2 & 63) + 1;
uint64_t m3 = (sh3 == 64) ? 0 : (nm3[l3] >> sh3);
if (m3){
int l2n = (l3 << 6) + sh3 + ctz(m3);
uint64_t b2 = 1ull << (l2n & 63);
if (fm3[l3] & b2){ fm2[l2n] = ~0ull; nm2[l2n] = ~0ull; }
else if (!(nm3[l3] & b2)){ fm2[l2n] = 0; nm2[l2n] = 0; }
int r2 = ctz(nm2[l2n]);
int l1n = (l2n << 6) + r2;
uint64_t b1 = 1ull << (l1n & 63);
if (fm2[l2n] & b1){ fm1[l1n] = ~0ull; nm1[l1n] = ~0ull; }
else if (!(nm2[l2n] & b1)){ fm1[l1n] = 0; nm1[l1n] = 0; }
return (l1n << 6) + ctz(nm1[l1n]);
}
uint64_t m4 = nm4 >> (l3 + 1);
if (m4){
int l3n = l3 + 1 + ctz(m4);
uint64_t b3 = 1ull << l3n;
if (fm4 & b3){ fm3[l3n] = ~0ull; nm3[l3n] = ~0ull; }
else if (!(nm4 & b3)){ fm3[l3n] = 0; nm3[l3n] = 0; }
int r3 = ctz(nm3[l3n]);
int l2n = (l3n << 6) + r3;
uint64_t b2 = 1ull << (l2n & 63);
if (fm3[l3n] & b2){ fm2[l2n] = ~0ull; nm2[l2n] = ~0ull; }
else if (!(nm3[l3n] & b2)){ fm2[l2n] = 0; nm2[l2n] = 0; }
int r2 = ctz(nm2[l2n]);
int l1n = (l2n << 6) + r2;
uint64_t b1 = 1ull << (l1n & 63);
if (fm2[l2n] & b1){ fm1[l1n] = ~0ull; nm1[l1n] = ~0ull; }
else if (!(nm2[l2n] & b1)){ fm1[l1n] = 0; nm1[l1n] = 0; }
return (l1n << 6) + ctz(nm1[l1n]);
}
return NL;
}
/* set L1 words [a, b] (inclusive, all full) to zero, grouped lazily */
static inline void zero_mid(int a, int b){
while (a <= b && (a & 63) != 0){
fm1[a] = 0; nm1[a] = 0; bubble_l1(a); a++;
}
while (a <= b && (b & 63) != 63){
fm1[b] = 0; nm1[b] = 0; bubble_l1(b); b--;
}
if (a > b) return;
while (a <= b && (a & 4095) != 0){
fm2[a >> 6] = 0; nm2[a >> 6] = 0; bubble_l2(a >> 6); a += 64;
}
while (a <= b && (b & 4095) != 4095){
fm2[b >> 6] = 0; nm2[b >> 6] = 0; bubble_l2(b >> 6); b -= 64;
}
if (a > b) return;
for (int l3 = a >> 12; l3 <= (b >> 12); l3++){
fm3[l3] = 0; nm3[l3] = 0; bubble_l3(l3);
}
}
/* set L1 words [a, b] (inclusive, all zero) to full, grouped lazily */
static inline void full_mid(int a, int b){
while (a <= b && (a & 63) != 0){
fm1[a] = ~0ull; nm1[a] = ~0ull; bubble_l1(a); a++;
}
while (a <= b && (b & 63) != 63){
fm1[b] = ~0ull; nm1[b] = ~0ull; bubble_l1(b); b--;
}
if (a > b) return;
while (a <= b && (a & 4095) != 0){
fm2[a >> 6] = ~0ull; nm2[a >> 6] = ~0ull; bubble_l2(a >> 6); a += 64;
}
while (a <= b && (b & 4095) != 4095){
fm2[b >> 6] = ~0ull; nm2[b >> 6] = ~0ull; bubble_l2(b >> 6); b -= 64;
}
if (a > b) return;
for (int l3 = a >> 12; l3 <= (b >> 12); l3++){
fm3[l3] = ~0ull; nm3[l3] = ~0ull; bubble_l3(l3);
}
}
static inline void zero_range(int l, int r){
int l1a = l >> 6, l1b = (r - 1) >> 6;
if (l1a == l1b){
materialize_word(l1a);
int lo = l & 63, hi = (r - 1) & 63;
uint64_t mask = (lo == 0 && hi == 63) ? ~0ull : ((1ull << (hi - lo + 1)) - 1) << lo;
fm1[l1a] &= ~mask;
nm1[l1a] &= ~mask;
bubble_l1(l1a);
return;
}
materialize_word(l1a);
fm1[l1a] &= ~(~0ull << (l & 63));
nm1[l1a] &= ~(~0ull << (l & 63));
bubble_l1(l1a);
materialize_word(l1b);
int hi = (r - 1) & 63;
uint64_t maskb = (hi == 63) ? ~0ull : ((1ull << (hi + 1)) - 1);
fm1[l1b] &= ~maskb;
nm1[l1b] &= ~maskb;
bubble_l1(l1b);
zero_mid(l1a + 1, l1b - 1);
}
static inline void full_range(int l, int r){
int l1a = l >> 6, l1b = (r - 1) >> 6;
if (l1a == l1b){
materialize_word(l1a);
int lo = l & 63, hi = (r - 1) & 63;
uint64_t mask = (lo == 0 && hi == 63) ? ~0ull : ((1ull << (hi - lo + 1)) - 1) << lo;
fm1[l1a] |= mask;
nm1[l1a] |= mask;
bubble_l1(l1a);
return;
}
materialize_word(l1a);
fm1[l1a] |= ~0ull << (l & 63);
nm1[l1a] |= ~0ull << (l & 63);
bubble_l1(l1a);
materialize_word(l1b);
int hi = (r - 1) & 63;
uint64_t maskb = (hi == 63) ? ~0ull : ((1ull << (hi + 1)) - 1);
fm1[l1b] |= maskb;
nm1[l1b] |= maskb;
bubble_l1(l1b);
full_mid(l1a + 1, l1b - 1);
}
static inline void add_val(int q, int r, uint32_t a){
uint64_t lo = ((uint64_t)a << r) & MASK;
uint64_t hi = (r == 0) ? 0ull : ((uint64_t)a >> (60 - r));
int c0 = point_add(q, lo);
int c1 = point_add(q + 1, hi + c0);
if (c1){
int start = q + 2;
int p = find_nonfull(start);
if (p > start) zero_range(start, p);
point_add(p, 1);
}
}
static inline void sub_val(int q, int r, uint32_t a){
uint64_t lo = ((uint64_t)a << r) & MASK;
uint64_t hi = (r == 0) ? 0ull : ((uint64_t)a >> (60 - r));
int b0 = point_sub(q, lo);
int b1 = point_sub(q + 1, hi + b0);
if (b1){
int start = q + 2;
int p = find_nonzero(start);
if (p > start) full_range(start, p);
point_sub(p, 1);
}
}
static inline uint64_t read_limb(int pos){
int l1 = pos >> 6, l2 = pos >> 12, l3 = pos >> 18;
uint64_t b3 = 1ull << l3;
if (fm4 & b3) return FULL;
if (!(nm4 & b3)) return 0;
uint64_t b2 = 1ull << (l2 & 63);
if (fm3[l3] & b2) return FULL;
if (!(nm3[l3] & b2)) return 0;
uint64_t b1 = 1ull << (l1 & 63);
if (fm2[l2] & b1) return FULL;
if (!(nm2[l2] & b1)) return 0;
uint64_t b = 1ull << (pos & 63);
if (fm1[l1] & b) return FULL;
if (!(nm1[l1] & b)) return 0;
return limb[pos];
}
/* ---- parse ---- */
static inline int rd(){
while (*P <= ' ') P++;
int v = 0;
while (*P > ' ') v = v*10 + (*P - '0'), P++;
return 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();
P++;
for (int i = 0; i < n; i++){
int op = *P++ - '0';
P++;
if (op == 1){
int neg = 0;
if (*P == '-'){ neg = 1; P++; }
int a = 0;
while (*P > ' '){ a = a*10 + (*P - '0'); P++; }
P++;
int b = 0;
while (*P > ' '){ b = b*10 + (*P - '0'); P++; }
P++;
int q = (int)(((uint64_t)b * 71582789ull) >> 32); /* b/60: M=ceil(2^32/60) */
int r = b - q * 60;
if (neg) sub_val(q, r, (uint32_t)a);
else if (a) add_val(q, r, (uint32_t)a);
} else {
int k = 0;
while (*P > ' '){ k = k*10 + (*P - '0'); P++; }
P++;
int q = (int)(((uint64_t)k * 71582789ull) >> 32); /* k/60 */
int r = k - q * 60;
uint64_t v = read_limb(q);
out[O++] = (char)('0' + ((v >> r) & 1));
out[O++] = '\n';
}
}
done(O, di, out, use_di);
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 7.85 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #2 | 9.8 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #3 | 58.48 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #4 | 98.34 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #5 | 311.99 us | 24 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #6 | 242.29 us | 28 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #7 | 1.418 ms | 64 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #8 | 518.77 us | 28 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #9 | 5.146 ms | 164 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #10 | 11.021 ms | 104 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #11 | 4.057 ms | 68 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #12 | 7.452 ms | 324 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #13 | 11.814 ms | 344 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #14 | 33.692 ms | 944 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #15 | 39.134 ms | 1 MB + 388 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #16 | 86.22 ms | 1 MB + 848 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #17 | 120.513 ms | 384 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #18 | 159.945 ms | 2 MB + 748 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #19 | 161.711 ms | 3 MB + 192 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #20 | 25.455 ms | 3 MB + 952 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #21 | 132.118 ms | 4 MB + 92 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #22 | 168.206 ms | 704 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #23 | 320.243 ms | 1 MB + 264 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #24 | 199.175 ms | 748 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #25 | 358.334 ms | 4 MB + 548 KB | Accepted | Score: 4 | 显示更多 |