跳转至

饼干交换大会

  • 参考时间限制:0.5 秒(参考环境:评测环境与性能;仅供预估)
  • 实际时间限制:标准程序在目标评测环境中处理最慢正式测试文件的基准时间的 2 倍,按 0.5 秒的倍数向上取整;若平台仅支持更粗的粒度,再向上取整到平台可设置值。
  • 内存限制:1024 MB

背景故事

茶会上的每位来宾都带了饼干,也报了自己最多能吃多少块。主持人宣布:“既然叫交换大会,就别坐下来把自己带的那盒吃完。”

于是,每块饼干只能从主人手中直接交给另一位来宾,不能转手,更不能绕一圈回到自己嘴里。来宾们不时修改携带数量和食量,主持人还会选一段相邻座位,估算这几个人内部最多能分掉多少块饼干。

这些都是纸上排练。每次估算结束,饼干一块也不会少。

(本故事由GPT-6 Astra重写)

形式化问题描述

有 \(n\) 个参与者,依次编号为 \(1\) 至 \(n\) . 参与者 \(i\) 的接收上限为 \(d_i\)(Demand),提供上限为 \(s_i\)(Supply),单位均为物品个数。物品只能从提供者直接交给接收者,且二者必须不同。两项上限都可以不全部使用。

按顺序处理 \(m\) 次操作,每次属于以下三类之一:

  1. 1 x d :令 \(d_x=d\) .
  2. 2 x s :令 \(s_x=s\) .
  3. 3 l r :只允许编号在 \([l,r]\) 内的参与者互相提供物品,求最大交付总量。

形式化地,对当前询问的每对不同参与者 \(i,j\) ,选择非负整数 \(f_{ij}\) 表示从 \(i\) 交付给 \(j\) 的物品数。要求每个提供者满足 \(\sum_{j\ne i}f_{ij}\le s_i\) ,每个接收者满足 \(\sum_{i\ne j}f_{ij}\le d_j\) ,并最大化 \(\sum_{i\ne j}f_{ij}\) . 这里所有下标及求和均限定在 \([l,r]\) 内。

同一参与者可以同时提供和接收,两个不同参与者也可以互相提供。询问不消耗任何数量;只有前两类操作会修改状态。

输入格式

第一行两个整数 \(n,m\) .

第二行 \(2n\) 个整数 \(d_1,s_1,d_2,s_2,\ldots,d_n,s_n\) .

接下来 \(m\) 行,每行三个整数,表示一条操作。

输出格式

对每个第三类操作输出一行一个整数。若没有第三类操作,则不输出任何内容。

样例 1

输入

3 5
1 1 2 2 2 3
3 1 3
3 1 2
1 1 2
3 1 3
3 1 2

输出

5
2
6
3

解释

第一次询问可以交付 \(5\) 块饼干:参与者 \(1\) 向 \(2\) 交付一块,参与者 \(2\) 向 \(3\) 交付两块,参与者 \(3\) 分别向 \(1\) 和 \(2\) 各交付一块。

修改后,参与者 \(1\) 的接收上限变成 \(2\) ,两个范围的最大交付量分别增为 \(6\) 和 \(3\) .

样例 2

输入

2 4
100 100 1 1
3 1 2
3 1 1
1 2 100
3 1 2

输出

2
0
101

解释

第一次询问只有两人,双方各向对方交付一块饼干,总量为 \(2\) . 单人范围不能向自己交付,答案为 \(0\) .

修改后,参与者 \(1\) 可以向 \(2\) 交付 \(100\) 块,参与者 \(2\) 仍可以向 \(1\) 交付一块,因此最后一次询问的答案为 \(101\) .

数据范围与保证

  • \(1\le n,m\le300\,000\) .
  • \(0\le d_i,s_i,d,s\le1\,000\,000\,000\) ,均为整数。
  • 修改操作满足 \(1\le x\le n\) .
  • 询问满足 \(1\le l\le r\le n\) .

数据分组

分值比例 额外条件
10% \(n,m\le10\) ,所有数量不超过 \(50\)
10% \(n,m\le100\)
20% \(n,m\le300\)
20% \(n,m\le3\,000\)
20% \(n,m\le50\,000\)
20% 无额外条件