---
author: nguyencter
tags: CMAT
title: CMAT Solution
---
$\Huge\text{CMAT Solution}$
-------
:::info
🔗 Links: [Đề bài](https://drive.google.com/drive/folders/1vkCZtOGkj1EsipJw55kkjZ-Oq_3P5Gnu)
📌 Tags: `prefix`
✍️ Writer: nguyencter
📋 Content:
[TOC]
:::
-----
## Giới Thiệu Đề Bài
Cho một bảng số nguyên gồm $n$ hàng và $m$ cột và $Q$ thao tác mỗi thao tác được mô tả bằng bộ năm số $x,y,u,v,c$ mỗi thao tác sẽ tăng tất cả các phần tử 𝑎(𝑖,𝑗) với mọi 𝑥 ≤ 𝑖 ≤ 𝑢 , 𝑦 ≤ 𝑗 ≤ 𝑣 lên một lượng là 𝑐 (𝑐 > 0)
**Yêu cầu:** Cho bảng số và dãy $Q$ thao tác, tìm phần tử lớn nhất khi xóa đi đúng $1$ thao tác trong $Q$ thao tác đã cho.
-----
## Thuật toán
Gọi $max_a$ là phần tử lớn nhất của mảng sau khi thực hiện $Q$ thao tác.
Với mỗi thao tác ta $t$ sẽ tăng một vùng tương ứng lên $c_t$ đơn vị vì vậy nên $max_t$ của mảng khi trừ đi thao tác này sẽ là $max_t=max($phần tử lớn nhất ngoài vùng được tăng$,max_a-c)$
Để giảm thời gian tính toán ta dùng $2$ mảng prefixmax.
Gọi $preUL[i][j]$ là phần tử lớn nhất từ hàng $1$ đến $i$ và cột $1$ đến $j$.
Gọi $preDR[i][j]$ là phần tử lớn nhất từ hàng $i$ đến $n$ và cột $j$ đến $m$.
Kết quả là $max(max_1,max_2,...,max_q)$.
Độ phức tạp là $O(n*m+Q)$
----
Tham khảo code mẫu ở [đây](https://github.com/nguyencter/CODE/blob/main/cmat.cpp).