/*<br />二維線段樹<br />*/<br />#include <iostream><br />#include <cstdio><br />#include <algorithm><br />#define LL(x) ((x) << 1)<br />#define RR(x) ((x) << 1 | 1)<br />using namespace std;<br />const int N = 1005;<br />struct Sub_tree{<br />int ly, ry;<br />int val;<br />int mid(){<br />return (ly + ry) >> 1;<br />}<br />};<br />struct Main_tree{<br />int lx, rx;<br />Sub_tree sub[4 * N];<br />int mid(){<br />return (lx + rx) >> 1;<br />}<br />}tree[4 * N];<br />bool hash[N][N];<br />bool readint(int &ret){<br />int sgn;<br />char c;<br />c = getchar();<br />if(c == EOF )<br />return true;<br />while(c != '-' && c < '0' || c > '9')<br />c = getchar();<br />sgn = (c == '-') ? -1 : 1;<br />ret = (c == '-') ? 0 : (c - '0');<br />while((c = getchar()) >= '0' && c <= '9')<br />ret = ret * 10 + (c - '0');<br />ret *= sgn;<br />return false;<br />}<br />void Sub_Build(int fa, int node, int ly, int ry){<br />tree[fa].sub[node].ly = ly;<br />tree[fa].sub[node].ry = ry;<br />tree[fa].sub[node].val = 0;<br />if(ly == ry)<br />return ;<br />int mid = (ly + ry) >> 1;<br />Sub_Build(fa, LL(node), ly, mid);<br />Sub_Build(fa, RR(node), mid + 1, ry);<br />}<br />void Build(int node, int lx, int rx, int ly, int ry){<br />tree[node].lx = lx;<br />tree[node].rx = rx;<br />Sub_Build(node, 1, ly, ry);<br />if(lx == rx){<br />return ;<br />}<br />int mid = (lx + rx) >> 1;<br />Build(LL(node), lx, mid, ly, ry);<br />Build(RR(node), mid + 1, rx, ly, ry);<br />}<br />void Sub_Update(int fa, int node, int dy, int val){<br />tree[fa].sub[node].val += val;<br />if(tree[fa].sub[node].ly == tree[fa].sub[node].ry){<br />/* // 這樣處理就wrong<br />if(val == 1 && tree[fa].sub[node].val == 0){<br />tree[fa].sub[node].val += val;<br />}<br />if(val == -1 && tree[fa].sub[node].val == 1){<br />tree[fa].sub[node].val += val;<br />}<br />*/<br />return ;<br />}<br />int mid = tree[fa].sub[node].mid();<br />if(dy <= mid)<br />Sub_Update(fa, LL(node), dy, val);<br />else<br />Sub_Update(fa, RR(node), dy, val);<br />tree[fa].sub[node].val = tree[fa].sub[LL(node)].val + tree[fa].sub[RR(node)].val;<br />}<br />void Update(int node, int dx, int dy, int val){<br />Sub_Update(node, 1, dy, val);<br />if(tree[node].lx == tree[node].rx){<br />return ;<br />}<br />int mid = tree[node].mid();<br />if(dx <= mid)<br />Update(LL(node), dx, dy, val);<br />else<br />Update(RR(node), dx, dy, val);<br />}<br />int Sub_Query(int fa, int node, int ly, int ry){<br />if(tree[fa].sub[node].ly == ly && tree[fa].sub[node].ry == ry){<br />return tree[fa].sub[node].val;<br />}<br />int mid = tree[fa].sub[node].mid();<br />if(ry <= mid){<br />return Sub_Query(fa, LL(node), ly, ry);<br />} else if(ly > mid){<br />return Sub_Query(fa, RR(node), ly, ry);<br />} else {<br />return Sub_Query(fa, LL(node), ly, mid) + Sub_Query(fa, RR(node), mid + 1, ry);<br />}<br />}<br />int Query(int node, int lx, int rx, int ly, int ry){<br />if(tree[node].lx == lx && tree[node].rx == rx){<br />return Sub_Query(node, 1, ly, ry);<br />}<br />int mid = tree[node].mid();<br />if(rx <= mid){<br />return Query(LL(node), lx, rx, ly, ry);<br />} else if(lx > mid){<br />return Query(RR(node), lx, rx, ly, ry);<br />} else {<br />return Query(LL(node), lx, mid, ly, ry) + Query(RR(node), mid + 1, rx, ly, ry);<br />}<br />}<br />int main(){<br />int m;<br />while(scanf("%d", &m) != EOF){<br />char str[2];<br />Build(1, 0, 1000, 0, 1000);<br />memset(hash, false, sizeof(hash));<br />int x, y;<br />int x1, x2, y1, y2;<br />while(m--){<br />scanf("%s", str);<br />if(str[0] == 'B'){<br />readint(x);<br />readint(y);<br />if(!hash[x][y]){ // 用了這個hash 才過的<br />Update(1, x, y, 1);<br />hash[x][y] = true;<br />}<br />}<br />else if(str[0] == 'D'){<br />readint(x);<br />readint(y);<br />if(hash[x][y]){<br />Update(1, x, y, -1);<br />hash[x][y] = false;<br />}<br />}else{<br />readint(x1);<br />readint(x2);<br />if(x1 > x2){ // 吃了好幾次RE<br />int temp = x1;<br />x1 = x2;<br />x2 = temp;<br />}<br />readint(y1);<br />readint(y2);<br />if(y1 > y2){<br />int temp = y1;<br />y1 = y2;<br />y2 = temp;<br />}<br />printf("%d/n", Query(1, x1, x2, y1, y2));<br />}<br />}<br />}<br />}
#include <iostream><br />#include <cstdio><br />#define lowbit(x) (x & (-x))<br />using namespace std;<br />const int N = 1002;<br />bool hash[N][N];<br />int tree[N][N];<br />bool readint(int &ret) {<br />int sgn;<br />char c;<br />c = getchar();<br />if (c == EOF)<br />return true;<br />while (c != '-' && c < '0' || c > '9')<br />c = getchar();<br />sgn = (c == '-') ? -1 : 1;<br />ret = (c == '-') ? 0 : (c - '0');<br />while ((c = getchar()) >= '0' && c <= '9')<br />ret = ret * 10 + (c - '0');<br />ret *= sgn;<br />return false;<br />}<br />inline void Add(int x, int y, int num) {<br />int temp;<br />while (x < N) {<br />temp = y;<br />while (temp < N) {<br />tree[x][temp] += num;<br />temp += lowbit(temp);<br />}<br />x += lowbit(x);<br />}<br />}<br />inline int Query(int x, int y) {<br />int sum = 0;<br />int temp;<br />while (x > 0) {<br />temp = y;<br />while (temp > 0) {<br />sum += tree[x][temp];<br />temp -= lowbit(temp);<br />}<br />x -= lowbit(x);<br />}<br />return sum;<br />}<br />int main() {<br />int m;<br />while (scanf("%d", &m) != EOF) {<br />char str[2];<br />int x, y;<br />int x1, x2, y1, y2;<br />memset(hash, false, sizeof(hash));<br />memset(tree, 0, sizeof(tree));<br />while (m--) {<br />scanf("%s", str);<br />if (str[0] == 'B') {<br />readint(x);<br />readint(y);<br />x++;<br />y++;<br />if (!hash[x][y]) {<br />Add(x, y, 1);<br />hash[x][y] = true;<br />}<br />} else if (str[0] == 'D') {<br />readint(x);<br />readint(y);<br />x++;<br />y++;<br />if (hash[x][y]) {<br />Add(x, y, -1);<br />hash[x][y] = false;<br />;<br />}<br />} else {<br />readint(x1);<br />readint(x2);<br />readint(y1);<br />readint(y2);<br />x1++;<br />x2++;<br />y1++;<br />y2++;<br />if (x1 > x2) {<br />int temp = x1;<br />x1 = x2;<br />x2 = temp;<br />}<br />if (y1 > y2) {<br />int temp = y1;<br />y1 = y2;<br />y2 = temp;<br />}<br />int ans = 0;<br />ans += Query(x2, y2);<br />ans -= Query(x1 - 1, y2);<br />ans -= Query(x2, y1 - 1);<br />ans += Query(x1 - 1, y1 - 1);<br />printf("%d/n", ans);<br />}<br />}<br />}<br />}<br />