fork(1) download
  1. program fwt_2D;
  2.  
  3. type tFwtArr = array[ 1..1000, 1..1000, 0..1 ] of int64;
  4.  
  5. var fwt_add, fwt_mul: tFwtArr;
  6. n, m: longInt;
  7.  
  8. function read2( var fwt: tFwtArr; x, y: longInt ): int64;
  9. var mul, add: int64;
  10. i: longInt;
  11. begin
  12. i := y; mul := 0; add := 0;
  13. while ( i > 0 ) do
  14. begin
  15. inc( mul, fwt[x][i][0] );
  16. inc( add, fwt[x][i][1] );
  17.  
  18. dec( i, i and -i );
  19. end;
  20.  
  21. exit( ( y * mul ) + add );
  22. end;
  23.  
  24. function read1( x, y: longInt ): int64;
  25. var mul, add: int64;
  26. i: longInt;
  27. begin
  28. i := x; mul := 0; add := 0;
  29. while ( i > 0 ) do
  30. begin
  31. inc( mul, read2( fwt_mul, i, y ) );
  32. inc( add, read2( fwt_add, i, y ) );
  33.  
  34. dec( i, i and -i );
  35. end;
  36.  
  37. exit( ( x * mul ) + add );
  38. end;
  39.  
  40. function fwt_read( x1, x2, y1, y2: longInt ): int64;
  41. begin
  42. exit( read1( x2, y2 ) - read1( x1 - 1, y2 ) - read1( x2, y1 - 1 ) + read1( x1 - 1, y1 - 1 ) );
  43. end;
  44.  
  45. procedure update2( var fwt: tFwtArr; x, y: longInt; mul, add: int64 );
  46. var i, j: longInt;
  47. begin
  48. i := x;
  49. while ( i <= n ) do
  50. begin
  51. j := y;
  52. while ( j <= m ) do
  53. begin
  54. inc( fwt[i][j][0], mul );
  55. inc( fwt[i][j][1], add );
  56.  
  57. inc( j, j and -j );
  58. end;
  59.  
  60. inc( i, i and -i );
  61. end;
  62. end;
  63.  
  64. procedure update1( x, y1, y2: longInt; mul, add: int64 );
  65. begin
  66. update2( fwt_mul, x, y1, mul, -mul * (y1 - 1) );
  67. update2( fwt_mul, x, y2, -mul, mul * y2 );
  68.  
  69. update2( fwt_add, x, y1, add, -add * (y1 - 1) );
  70. update2( fwt_add, x, y2, -add, add * y2 );
  71. end;
  72.  
  73. procedure fwt_update( x1, x2, y1, y2: longInt; k: int64 );
  74. begin
  75. update1( x1, y1, y2, k, -k * (x1 - 1) );
  76. update1( x2, y1, y2, -k, k * x2 );
  77. end;
  78.  
  79. var q, t, x1, x2, y1, y2, i: longInt;
  80. k: int64;
  81.  
  82. begin
  83. readln( n, m, q );
  84. for i := 1 to q do
  85. begin
  86. read( t, x1, y1, x2, y2 );
  87. if ( t = 1 ) then
  88. begin
  89. k := fwt_read( x1, x2, y1, y2 );
  90. if ( k > 0 ) then
  91. writeln( 'Friends' )
  92. else if ( k < 0 ) then
  93. writeln( 'Enemies' )
  94. else
  95. writeln( 'I don''t know' );
  96. end
  97. else
  98. begin
  99. readln( k );
  100.  
  101. fwt_update( x1, x2, y1, y2, k );
  102. end;
  103. end;
  104. end.
  105.  
Success #stdin #stdout 0s 31480KB
stdin
Standard input is empty
stdout
Standard output is empty