canuc80k0208·9/50

Đếm Cây Trong Hình Chữ Nhật

Nộp bài trên LQDOJ

Bài 02 · Prefix Sum

Một khu rừng được biểu diễn bằng lưới vuông gồm hàng và cột. Ô có cây được ký hiệu bằng *, còn ô trống được ký hiệu bằng .. Hàng được đánh số từ trên xuống và cột được đánh số từ trái sang phải, đều bắt đầu từ .

Mỗi truy vấn cho hai ô và , lần lượt là góc trên-trái và góc dưới-phải của một hình chữ nhật. Cả bốn cạnh của hình chữ nhật đều được tính vào vùng cần xét. Hãy đếm số cây nằm trong mỗi hình chữ nhật.

Input

  • Dòng đầu chứa hai số nguyên và .
  • dòng tiếp theo, mỗi dòng gồm ký tự . hoặc *, mô tả khu rừng.
  • Mỗi trong dòng cuối chứa bốn số nguyên .

Output

  • Với mỗi truy vấn, in số cây nằm trong hình chữ nhật tương ứng trên một dòng.

Constraints

  • .
  • .
  • .
  • .

Scoring

  • Subtask ( số điểm): và .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

5 5
.*..*
**...
..*..
*..**
...*.
1 1 1 5
1 1 5 5
2 2 4 4
3 3 3 3
4 4 5 5

Output

2
9
3
1
3

Giải thích: Hàng đầu có cây, cả lưới có cây, hình chữ nhật từ đến có cây, ô có một cây và vùng góc phải dưới có cây.

Lời giải tóm tắt
  • Ý tưởng: Đặt P[y][x] là số cây trong hình chữ nhật từ (1,1) đến (y,x). Khi thêm ô (y,x), ta cộng hai vùng phía trên và bên trái, trừ phần giao bị đếm hai lần, rồi cộng 1 nếu ô hiện tại có cây.
  • Ý tưởng: Với truy vấn (y1,x1) đến (y2,x2), bắt đầu từ P[y2][x2], trừ vùng phía trên và vùng bên trái của hình cần lấy, sau đó cộng lại giao của hai vùng vừa bị trừ. Hàng 0 và cột 0 toàn số 0 giúp công thức đúng cả ở biên.
  • Chứng minh tính đúng: Theo quy nạp theo thứ tự hàng-cột, công thức xây dựng làm P[y][x] đếm đúng mọi cây trong hình chữ nhật tiền tố. Trong công thức truy vấn, mọi ô bên trong hình cần đếm còn lại đúng một lần; ô ngoài hình bị loại, còn vùng góc trên-trái bị trừ hai lần được cộng lại một lần. Vì thế kết quả chính xác.
  • Độ phức tạp: Xây bảng trong O(n^2), mỗi truy vấn O(1), bộ nhớ O(n^2).