結果

問題 No.3464 Max and Sum on Grid
コンテスト
ユーザー tyawanmusi
提出日時 2026-09-28 21:20:43
言語 PyPy3
(7.3.23 + ACL)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
TLE  
実行時間 -
コード長 3,910 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 62 ms
コンパイル使用メモリ 83,312 KB
実行使用メモリ 168,344 KB
最終ジャッジ日時 2026-09-28 21:20:55
合計ジャッジ時間 11,283 ms
ジャッジサーバーID
(参考情報)
judge2_0 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other TLE * 1 -- * 9
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

class BinaryIndexedTree:
    def __init__(self, n):
        if isinstance(n, int):
            self.bit = [0] * n
        else:
            self.bit = n.copy()
            n = len(self.bit)
            for i in range(1, n + 1):
                j = i + (i & -i)
                if j <= n:
                    self.bit[j-1] += self.bit[i-1]

    def add(self, i, x):
        i += 1
        while i <= len(self.bit):
            self.bit[i-1] += x
            i += i & -i

    def sum_sub(self, r):
        total = 0
        while r:
            total += self.bit[r-1]
            r -= r & -r
        return total

    def sum(self, l, r):
        return self.sum_sub(r) - self.sum_sub(l)


class Mo_Base:
    def __init__(self, n):
        assert n >= 0
        self.n = n
        self.queries = []
        self._u = self._v = 0
        # 空区間 [0, 0) の状態を初期化する
        self.ans = 0

    def u_plus(self, u, v): raise NotImplementedError
    def u_minus(self, u, v): raise NotImplementedError
    def v_plus(self, u, v): raise NotImplementedError
    def v_minus(self, u, v): raise NotImplementedError

    def get_ans(self):
        return self.ans

    def add_query(self, u, v):
        self.queries.append((u, v, len(self.queries)))

    def solve(self, block_size=None):
        q = len(self.queries)
        if q == 0:
            return []
        bsize = max(1, int(self.n / q**0.5)) if block_size is None else block_size
        assert isinstance(bsize, int) and bsize > 0
        self.queries.sort(key=lambda x: (
            x[0] // bsize,
            x[1] if (x[0] // bsize) % 2 == 0 else -x[1]
        ))
        ans = [0] * q
        u, v = self._u, self._v
        u_plus, u_minus = self.u_plus, self.u_minus
        v_plus, v_minus = self.v_plus, self.v_minus
        get_ans = self.get_ans
        for target_u, target_v, q_i in self.queries:
            while v < target_v:
                v_plus(u, v)
                v += 1
            while u > target_u:
                u_minus(u, v)
                u -= 1
            while v > target_v:
                v_minus(u, v)
                v -= 1
            while u < target_u:
                u_plus(u, v)
                u += 1
            ans[q_i] = get_ans()
        self._u, self._v = u, v
        return ans

class Mo(Mo_Base):
    def __init__(self, n):
        if isinstance(n, int):
            super().__init__(n)
            self.a = [0] * n
        else:
            super().__init__(len(n))
            self.a = n

    def u_plus(self, u, v):
        self.ans += a[u] * cntb.sum(0, a[u] + 1) + sumb.sum(a[u] + 1, maxe)
        cnta.add(a[u], 1)
        suma.add(a[u], a[u])
        return

    def u_minus(self, u, v):
        # f(u, v) -> f(u-1, v)
        self.ans -= a[u-1] * cntb.sum(0, a[u-1] + 1) + sumb.sum(a[u-1] + 1, maxe)
        cnta.add(a[u-1], -1)
        suma.add(a[u-1], -a[u-1])
        return

    def v_plus(self, u, v):
        # f(u, v) -> f(u, v+1)
        self.ans += b[v] * cnta.sum(0, b[v] + 1) + suma.sum(b[v] + 1, maxe)
        cntb.add(b[v], 1)
        sumb.add(b[v], b[v])
        return

    def v_minus(self, u, v):
        # f(u, v) -> f(u, v-1)
        self.ans -= b[v-1] * cnta.sum(0, b[v-1] + 1) + suma.sum(b[v-1] + 1, maxe)
        cntb.add(b[v-1], -1)
        sumb.add(b[v-1], -b[v-1])
        return

import sys
input = sys.stdin.readline
maxe = 10**5 + 1
n, q = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
cnta = BinaryIndexedTree(maxe)
suma = BinaryIndexedTree(maxe)
cntb = BinaryIndexedTree(maxe)
sumb = BinaryIndexedTree(maxe)
mo = Mo(n)
for _ in range(q):
    l, d, r, u = map(int, input().split())
    mo.add_query(l-1, d-1)
    mo.add_query(l-1, u)
    mo.add_query(r, d-1)
    mo.add_query(r, u)
res = mo.solve()
for i in range(0, len(res), 4):
    ans = res[i+3] - res[i+2] - res[i+1] + res[i]
    print(ans)
0