#1137. 例1-动态逆序对统计问题

例1-动态逆序对统计问题

动态逆序对统计问题(增强版)

题目描述

给定一个初始数列,需要处理以下三种操作:

  1. 单点修改1 x d
    将数列中第 x 个元素的值增加 d。

  2. 区间修改2 l r d
    将数列中区间 [l, r] 的所有元素增加 d。

  3. 逆序对查询3
    查询当前数列的逆序对总数。
    (逆序对定义为:对任意一对下标 i < j,若 a[i] > a[j],则称 (a[i], a[j]) 为一个逆序对)

在所有操作执行完毕后,对于每个类型 3 的查询操作,输出一行结果,其值为当前数列的逆序对总数。

输入格式

  • 第一行包含两个整数 n 和 m,分别表示初始数列的长度以及操作的总次数。
  • 第二行包含 n 个整数,表示初始数列中的元素。
  • 接下来 m 行,每行包含一个操作指令,格式为上述三种操作之一。

输出格式

对于每个类型 3 操作,输出一行结果,表示当前数列的逆序对总数。

数据范围

  • 1 ≤ n, m ≤ 100,000
  • 初始数列中每个元素的绝对值 ≤ 10^9
  • 修改值 d 的绝对值 ≤ 10^9
  • 保证在任何时刻,数列中每个元素的绝对值 ≤ 10^18
5 5
2 4 1 3 5
3
1 2 1
3
2 3 5 2
3
3
3
1

样例解释

  • 初始状态
    数组为 [2, 4, 1, 3, 5]
    逆序对为:(2,1), (4,1), (4,3),共 3 个,因此第一次查询输出 3。

  • 单点修改操作 1 2 1
    将位置 2 的元素(原值 4)增加 1,数组变为 [2, 5, 1, 3, 5]。
    此时逆序对为:(2,1), (5,1), (5,3)(原 (4,1) 和 (4,3) 被修改消除,并新增 (5,1) 和 (5,3)),逆序对总数仍为 3,因此第二次查询输出 3。

  • 区间修改操作 2 3 5 2
    将区间 [3,5] 的所有元素均增加 2,数组变为 [2, 5, 3, 5, 7]。
    此时逆序对发生变化,新的逆序对为:(2,3), (5,3), (5,5), (5,7)(示例中给出的是大致结果),查询结果为 5,因此第三次查询输出 5。