Given an array of elements, divide it into blocks of size . For , you'd have blocks of size .
Each block precomputes something useful: sum, min, max, or whatever your query needs.
A range query then combines at most partial blocks (at the ends) plus complete blocks in the middle. Why ?
It balances two costs: the number of blocks () and the block size (). When , both are , giving you time for queries and updates. Any other block size would make one term dominate.