题目链接:http://codeforces.com/problemset/problem/438/D

The Child and Sequence

time limit per test:4 seconds
memory limit per test:256 megabytes
input:standard input
output:standard output

At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at him. A lot of important things were lost, in particular the favorite sequence of Picks.

Fortunately, Picks remembers how to repair the sequence. Initially he should create an integer array a[1], a[2], ..., a[n]. Then he should perform a sequence of m operations. An operation can be one of the following:

  1. Print operation l, r. Picks should write down the value of .
  2. Modulo operation l, r, x. Picks should perform assignment a[i] = a[imod x for each i (l ≤ i ≤ r).
  3. Set operation k, x. Picks should set the value of a[k] to x (in other words perform an assignment a[k] = x).

Can you help Picks to perform the whole sequence of operations?

Input

The first line of input contains two integer: n, m (1 ≤ n, m ≤ 105). The second line contains n integers, separated by space: a[1], a[2], ..., a[n] (1 ≤ a[i] ≤ 109) — initial value of array elements.

Each of the next m lines begins with a number type .

  • If type = 1, there will be two integers more in the line: l, r (1 ≤ l ≤ r ≤ n), which correspond the operation 1.
  • If type = 2, there will be three integers more in the line: l, r, x (1 ≤ l ≤ r ≤ n; 1 ≤ x ≤ 109), which correspond the operation 2.
  • If type = 3, there will be two integers more in the line: k, x (1 ≤ k ≤ n; 1 ≤ x ≤ 109), which correspond the operation 3.

Output

For each operation 1, please print a line containing the answer. Notice that the answer may exceed the 32-bit integer.

Examples

Input
5 5
1 2 3 4 5
2 3 5 4
3 3 5
1 2 5
2 1 3 3
1 1 3

Output
8
5

Input
10 10
6 9 6 7 6 1 10 10 9 5
1 3 9
2 7 10 9
2 5 10 8
1 4 7
3 3 7
2 7 9 9
1 2 4
1 6 6
1 5 9
3 1 10

Output
49
15
23
1
9

Note

Consider the first testcase:

  • At first, a = {1, 2, 3, 4, 5}.
  • After operation 1, a = {1, 2, 3, 0, 1}.
  • After operation 2, a = {1, 2, 5, 0, 1}.
  • At operation 3, 2 + 5 + 0 + 1 = 8.
  • After operation 4, a = {1, 2, 2, 0, 1}.
  • At operation 5, 1 + 2 + 2 = 5.

思路:稍微分析一下题目,就能够看出这道题是线段树的单点更新,区间更新,区间求和问题。但是有一个问题存在,这里区间更新是取模,直接对和进行取模肯定是错误的,所以得换种想法做。考虑题目给的时间很充足,而且测试数据是单个样例测试,所以可以尝试区间更新时更新到叶子节点。但这种做法好像还是不太保险,仔细斟酌一下,其实对于取模操作,只有当该数大于模数,才需要更新,否则不需要,这样就类似于DFS的剪枝了,所以将每个区间的最大值求出来,更新时与模数比较,模数大就直接返回,不必向下更新了,以节约时间开销,这样就更有胜算了,事实证明是的,后来算了一下复杂度,发现这样做的话复杂度并不是很高。详见代码。

附上AC代码:

#include <bits/stdc++.h>
#define lrt rt<<1
#define rrt rt<<1|1
#define lson l, m, lrt
#define rson m+1, r, rrt
using namespace std;
typedef long long ll;
const int maxn = 100005;
ll sumv[maxn<<2], maxv[maxn<<2];
int n, q;void push_up(int rt){sumv[rt] = sumv[lrt]+sumv[rrt];maxv[rt] = max(maxv[lrt], maxv[rrt]);
}void build(int l, int r, int rt){if (l == r){int num;cin >> num;sumv[rt] = num;maxv[rt] = num;return ;}int m = (l+r)>>1;build(lson);build(rson);push_up(rt);
}void update1(int p, int val, int l, int r, int rt){if (l == r){sumv[rt] = val;maxv[rt] = val;return ;}int m = (l+r)>>1;if (p <= m)update1(p, val, lson);elseupdate1(p, val, rson);push_up(rt);
}void update2(int cl, int cr, int val, int l, int r, int rt){if (maxv[rt] < val)return ;if (l == r){sumv[rt] %= val;maxv[rt] %= val;return ;}int m = (l+r)>>1;if (cl <= m)update2(cl, cr, val, lson);if (cr > m)update2(cl, cr, val, rson);push_up(rt);
}ll query(int ql, int qr, int l, int r, int rt){if (ql<=l && r<=qr)return sumv[rt];int m = (l+r)>>1;ll sumr = 0;if (ql <= m)sumr += query(ql, qr, lson);if (qr > m)sumr += query(ql, qr, rson);return sumr;
}int main(){ios::sync_with_stdio(false);cin.tie(0);cin >> n >> q;build(1, n, 1);int type, l, r, x;while (q--){cin >> type >> l >> r;if (1 == type)cout << query(l, r, 1, n, 1) << endl;else if (2 == type){cin >> x;update2(l, r, x, 1, n, 1);}elseupdate1(l, r, 1, n, 1);}return 0;
}

CodeForces 438D The Child and Sequence相关推荐

  1. CodeForces 438D - The Child and Sequence(线段树)

    At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at ...

  2. codeforces CF438D The Child and Sequence 线段树

    $ \Rightarrow $ 戳我进CF原题 D. The Child and Sequence time limit per test: 4 seconds memory limit per te ...

  3. Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸

    D. The Child and Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  4. Codeforces 437C The Child and Toy(贪心)

    题目连接:Codeforces 437C  The Child and Toy 贪心,每条绳子都是须要割断的,那就先割断最大值相应的那部分周围的绳子. #include <iostream> ...

  5. 数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

    值域线段树+势能线段树+扫描线 KiKi's K-Number ball The Child and Sequence 「雅礼集训 2017 Day1」市场 Atlantis KiKi's K-Num ...

  6. codeforces438 D. The Child and Sequence

    2020威海区域赛G. Caesar Cipher就用到了此思想( 今天碰到模板题了还是再写一遍吧 D. The Child and Sequence 区间取模操作模板题 有一个公式 x%p<x ...

  7. codeforce438D The Child and Sequence

    codeforce438D The Child and Sequence At the children's day, the child came to Picks's house, and mes ...

  8. Codeforces 438D 线段树 解题报告

    D. The Child and Sequence At the children's day, the child came to Picks's house, and messed his hou ...

  9. 【CodeForces - 438D】The Child and Sequence(线段树区间取模操作)

    题干: At the children's day, the child came to Picks's house, and messed his house up. Picks was angry ...

最新文章

  1. ASP.NET DEMO 14: 如何在 GridView/DataGrid 模板列中使用自动回发的 CheckBox/DropDownList
  2. Matlab与线性代数--矩阵的LU分解
  3. python3 __import__ 简介
  4. [收集]Visual C#中调用Windows API
  5. [BUUCTF-pwn]——jarvisoj_tell_me_something
  6. python3 打印目录下所有模块_python3基础12详解模块和包(库)|构建|使用
  7. 分布式文件系统(HDFS)与 linux系统文件系统 对比
  8. protobuf2和3同时安装_在 Ubuntu 上安装 Protobuf 3 的教程详解
  9. 使用PwDump导出本地Windows SAM散列并解密(解密windows账户密码)
  10. Visual Prolog 的 Web 专家系统 (10)
  11. win10 mbr下装linux,(MBR模式)Win10下安装Ubuntu18.04双系统
  12. drupal.behavior 和 document.ready 没有直接的关系
  13. 未能成功连接停车场服务器,停车场管理系统常见问题解答
  14. 变送器故障码与解决办法剖析汇总
  15. pythonshell窗口是什么_使用IDLE的Python shell窗口实例详解
  16. 自学Java day8 项目-零钱通 从jvav到架构师
  17. 软件工程如何选择方向
  18. 【数据结构与算法分析】证logXX 对所有的X0成立
  19. 51单片机 8x8LED点阵屏循环显示数字0~9
  20. 抖音初期运营,如何让自己的抖音短视频账号快速涨粉:国仁楠哥

热门文章

  1. 深度学习论文: Lightweight and Progressively-Scalable Networks for Semantic Segmentation及其PyTorch实现
  2. 计算两个日期之间的天数(C语言实现)
  3. S4/HANA ME21N创建PO 输出控制消息按钮丢失解决方法(切换EDI 输出模式BRF+至NAST模式)
  4. R: Error in P1$PC1 : $ operator is invalid for atomic vectors
  5. 某公司人工智能面试总结
  6. ios光伏监控运维的技术服务支持
  7. 基于单片机的消毒柜控制仿真设计(#0030)
  8. 图说盘点:2015中国智慧城市的突破(上)
  9. 2.通过计算同轴线内导体插入矩形波导的深度h和同轴线距离右边界的看距离l以达到降低S参数的目的
  10. 解决“卡巴斯基 2009”与“Office 2003/2007”(含Word2007、Execl 2007)冲突的方法