1 #define PERL_NO_GET_CONTEXT
8 #define CHECK_INDEX(idx, min, max, ret) if(idx < min || idx > max) { \
9 croak("Index not in range [" IVdf "," IVdf "]", (IV)(min), (IV)(max)); \
18 bit* bit_create(IV len) {
20 croak("Length less than 1");
27 Newxz(ret->t, len, IV);
31 void bit_free(bit *b) {
36 IV bit_query(bit *b, IV idx) {
37 CHECK_INDEX(idx, 0, b->n - 1, 0);
40 ret += b->t[idx], idx -= idx & -idx;
44 void bit_update(bit *b, IV idx, IV value) {
45 CHECK_INDEX(idx, 0, b->n - 1, );
47 b->t[idx] += value, idx += idx & -idx;
50 void bit_clear(bit *b) {
59 bit2d* bit2d_create(IV n, IV m) {
61 croak("A dimension is less than 1");
69 Newxz(ret->t, n * m, IV);
73 void bit2d_free(bit2d *b) {
78 IV bit2d_query(bit2d *b, IV i1, IV i2) {
79 CHECK_INDEX(i1, 1, b->n - 1, 0);
80 CHECK_INDEX(i2, 1, b->m - 1, 0);
81 if(i1 > b->n || i1 < 1) {
82 croak("Index 1 not in range [1," IVdf "]", b->n);
85 if(i2 > b->m || i2 < 1) {
86 croak("Index 2 not in range [1," IVdf "]", b->m);
93 ret += b->t[i1 * b->m + i2], i2 -= i2 & -i2;
99 void bit2d_update(bit2d *b, IV i1, IV i2, IV value) {
100 CHECK_INDEX(i1, 1, b->n - 1, );
101 CHECK_INDEX(i2, 1, b->m - 1, );
106 b->t[i1 * b->m + i2] += value, i2 += i2 & -i2;
111 void bit2d_clear(bit2d *b) {
112 Zero(b->t, b->n * b->m, IV);
115 typedef bit *Algorithm__BIT__XS;
116 typedef bit2d *Algorithm__BIT2D__XS;
118 MODULE = Algorithm::BIT::XS PACKAGE = Algorithm::BIT::XS PREFIX = bit_
122 Algorithm::BIT::XS bit_create(IV len);
124 void bit_free(Algorithm::BIT::XS b);
128 IV bit_query(Algorithm::BIT::XS b, IV idx);
130 void bit_update(Algorithm::BIT::XS b, IV idx, IV value);
132 void bit_clear(Algorithm::BIT::XS b);
134 MODULE = Algorithm::BIT::XS PACKAGE = Algorithm::BIT2D::XS PREFIX = bit2d_
138 Algorithm::BIT2D::XS bit2d_create(IV n, IV m);
140 void bit2d_free(Algorithm::BIT2D::XS b);
144 IV bit2d_query(Algorithm::BIT2D::XS b, IV i1, IV i2);
146 void bit2d_update(Algorithm::BIT2D::XS b, IV i1, IV i2, IV value);
148 void bit2d_clear(Algorithm::BIT2D::XS b);