Simple Application of a two-dimensional tree array without deformation
Question link: http://acm.hdu.edu.cn/showproblem.php? PID = 1, 1892
// Two-dimensional tree array <br/> // <br/> # include <stdio. h> <br/> const int size = 1002; </P> <p> int C [size] [size]; <br/> int d [size] [size]; </P> <p> int lowbit (int n) <br/>{< br/> return N & (-N); <br/>}</P> <p> void modify (int x, int y, int delta) <br/> {<br/> for (INT I = x; I <= 1001; I + = lowbit (I )) <br/> for (Int J = y; j <= 1001; j + = lowbit (j )) <br/> {<br/> C [I] [J] + = delta; <br/>}</P> <p> int sum (int I, Int J) <br/> {<B R/> // if (I <= 0 | j <= 0) return 0; </P> <p> int result = 0; <br/> for (INT x = I; x> 0; X-= lowbit (x) <br/> {<br/> for (INT y = J; y> 0; y-= lowbit (y) <br/>{< br/> result + = C [x] [Y]; <br/>}</P> <p> return result; <br/>}</P> <p> int min (int x, int y) <br/>{< br/> return x <Y? X: Y; <br/>}</P> <p> int max (int x, int y) <br/>{< br/> return x> Y? X: Y; <br/>}</P> <p> int main () <br/>{< br/> int cas, Q, CA; <br/> char STR; <br/> int X1, Y1, X2, Y2, N1; <br/> int xmin, ymin, xmax, Ymax; <br/> int ans; <br/> scanf ("% d", & CAS); <br/> for (CA = 1; Ca <= CAS; CA ++) <br/>{< br/> printf ("case % d:/N", CA ); <br/> // initialization <br/> for (x1 = 1; X1 <= 1001; X1 ++) <br/> for (Y1 = 1; y1 <= 1001; Y1 ++) <br/> {<br/> d [X1] [Y1] = 1; <br/> C [X1] [Y1] = lowbit (X1) * lowbit (Y1); <br/>}< br/> scanf ("% d ", & Q); <br/> while (Q --) <br/>{< br/> getchar (); <br/> scanf ("% C ", & Str); <br/> If (STR ='s ') // sum <br/>{< br/> scanf ("% d", & X1, & Y1, & X2, & Y2 ); <br/> X1 ++; Y1 ++; x2 ++; Y2 ++; <br/> xmax = max (x1, x2 ); <br/> Ymax = max (Y1, Y2); <br/> xmin = min (x1, x2); <br/> ymin = min (Y1, Y2 ); <br/> int temp = sum (xmax, ymin-1) + sum (xmin-1, Ymax)-sum (xmin-1, ymin-1); <br/> ans = sum (xmax, Ymax) -Temp; // This prevents some out-of-bounds <br/> printf ("% d/N", ANS ); <br/>}< br/> else if (STR = 'A ') // Add <br/>{< br/> scanf ("% d", & X1, & Y1, & N1 ); <br/> X1 ++; Y1 ++; <br/> modify (x1, Y1, N1); <br/> d [X1] [Y1] + = N1; <br/>}< br/> else if (STR = 'D ') // Delete <br/>{< br/> scanf ("% d", & X1, & Y1, & N1 ); <br/> X1 ++; Y1 ++; <br/> If (d [X1] [Y1] <N1) n1 = d [X1] [Y1]; <br/> modify (x1, Y1,-N1); <br/> d [X1] [Y1]-= N1; <br/>}< br/> else if (STR = 'M ') // move <br/>{< br/> scanf ("% d", & X1, & Y1, & X2, & Y2, & N1); <br/> X1 ++; Y1 ++; x2 ++; Y2 ++; <br/> If (N1> d [X1] [Y1]) <br/> n1 = d [X1] [Y1]; <br/> d [X1] [Y1]-= N1; <br/> d [X2] [y2] + = N1; <br/> modify (x1, Y1,-N1); <br/> modify (X2, Y2, n1); <br/>}< br/> return 0; <br/>}</P> <p>/* <br/> 100 <br/> 3 <br/> S 1 1 1 <br/> A 1 1 2 <br/> S 1 1 1 <br/> 3 <br/> S 1 1 1 1 <br/> A 1 2 <br/> S 1 1 1 1 1 2 <br/> */