I'm confused about why this solution exceeds the two-second limit. The grid size is at most N = 2000, and there can be up to U = 100000 updates. Each update seems constant time because it only checks and changes the four cells related by 180-degree symmetry, so I expected the total complexity to be roughly O(N² + U). The initial preprocessing loops over about N²/4 groups, and then each update processes one group of four cells. Is there something in the Python implementation that makes it slower than that estimate?
3 Answers
The update portion is effectively constant time because each query touches only four symmetric cells. The expensive part is the initial pass: for every group of four, you build temporary lists and perform multiple searches with temp.count('.'), temp.count('#'), and so on. Compute the number of dots once, derive the number of hashes from 4 minus that value, and avoid creating temporary lists or coordinate lists when possible.
Be careful with the performance assumptions behind the estimate. Big-O describes how the work grows; it does not tell you the exact runtime, and constants still matter in practice. Also, the bound should be based on the algorithm and implementation rather than a claim that the judge can process a fixed number of operations per second. Use buffered input and output, reduce allocations in the setup pass, and store the state for each four-cell symmetry group so updates can adjust the answer directly.
The overall high-level complexity is close to O(N² + U), but that doesn’t automatically mean it will fit in two seconds. In the preprocessing loop, every group creates a coordinate list, repeatedly appends values, and calls count() several times. Each count() scans the list again, so you’re doing a lot of extra Python-level work—roughly a million group iterations when N is 2000. Python is also much slower per operation than optimized C++, so a rough server estimate based on C++ operations isn’t applicable.
Also, Big-O hides constant factors. Two solutions can both be O(N² + U) while one is several times slower because it allocates lists and repeats scans inside the loop.

The input size alone doesn’t guarantee that the program is fast enough. Python often handles around 10^7 simple operations per second, not the hundreds of millions sometimes quoted for C++. List construction, indexing, and repeated function calls add up quickly.