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.

Sample test(s)
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.
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
long long l, r, s, maxx;
}num[800005];
long long n, m, key; template <class T>
inline bool scan_d(T &ret) {
char c; int sgn;
if(c=getchar(),c==EOF) return 0; //EOF
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn=(c=='-')?-1:1;
ret=(c=='-')?0:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
ret*=sgn;
return 1;
} inline void out(long long x) {
if(x>9) out(x/10);
putchar(x%10+'0');
} void build(int l,int r,int k)
{
num[k].l = l;
num[k].r = r;
num[k].s = 0;
num[k].maxx = 0;
if(l == r) return;
int mi = (l+r)>>1;
build(l,mi,k+k);
build(mi+1,r,k+k+1);
return;
} void update(int l, int r, int k)
{
if(num[k].l==num[k].r)
{
num[k].s = key;
num[k].maxx = key;
return;
}
int mi = (num[k].l+num[k].r)>>1;
if(l > mi) update(l,r,k+k+1);
else if(r <= mi) update(l,r,k+k);
else
{
update(l,mi,k+k);
update(mi+1,r,k+k+1);
}
num[k].s = num[k+k].s + num[k+k+1].s;
num[k].maxx = max(num[k+k].maxx,num[k+k+1].maxx);
return;
} void upmod(int l, int r, int k)
{
if(num[k].maxx<key) return;
if(num[k].l==num[k].r)
{
num[k].s%=key;
num[k].maxx = num[k].s;
return;
}
int mi = (num[k].l+num[k].r)>>1;
if(l > mi) upmod(l,r,k+k+1);
else if(r <= mi) upmod(l,r,k+k);
else
{
upmod(l,mi,k+k);
upmod(mi+1,r,k+k+1);
}
num[k].s = num[k+k].s + num[k+k+1].s;
num[k].maxx = max(num[k+k].maxx,num[k+k+1].maxx);
return;
} long long query(int k,int l,int r)
{
if(num[k].l==l && num[k].r==r)
{
return num[k].s;
}
else
{
int mi = (num[k].l+num[k].r)>>1;
if(r<=mi) return query(k+k,l,r);
else if(l>mi) return query(k+k+1,l,r);
else return query(k+k,l,mi)+query(k+k+1,mi+1,r);
}
} int main()
{
ios_base::sync_with_stdio(0);
int Case;
int a, b, c;
memset(num,0,sizeof(num));
scan_d(n);
scan_d(m);
build(1,n,1);
for(int i=1;i<=n;i++){
scan_d(key);
update(i,i,1);
}
while(m--)
{
scan_d(c);
switch(c)
{
case 1:
scan_d(a);
scan_d(b);
out(query(1,a,b));
putchar('\n');
break;
case 2:
scan_d(a);
scan_d(b);
scan_d(key);
upmod(a,b,1);
break;
case 3:
scan_d(a);
scan_d(key);
update(a,a,1);
break;
}
}
return 0;
}

另一种的线段树写法:

#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
#include <deque>
#include <cstring>
#include <cstdio>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <cstdlib>
#include <iomanip>
using namespace std;
typedef long long LL;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 100010; LL sum[maxn<<2], ma[maxn<<2];
void PushUP(int rt) {
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void PushUP2(int rt) {
ma[rt] = max(ma[rt<<1], ma[rt<<1|1]);
}
void build(int l,int r,int rt) {
if (l == r) {
//scanf("%I64d",&sum[rt]);
cin >> sum[rt];
ma[rt] = sum[rt];
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
PushUP(rt);
PushUP2(rt);
}
//#define lson l , m , rt << 1
//#define rson m + 1 , r , rt << 1 | 1
void MOD(int L,int R,int l,int r,int rt, LL mod)
{
// if(R < l || L > r) return ;
// if(L <= l && r <= R && ma[rt] < mod) return ;
if(ma[rt] < mod) return ;
if(l == r) {sum[rt] %= mod; ma[rt] = sum[rt];return ;} int m = (l + r) >> 1;
if (L <= m) MOD(L, R , lson, mod);
if (R > m) MOD(L, R , rson, mod);
PushUP(rt);
PushUP2(rt);
} void update(int p,LL add,int l,int r,int rt) {
if (l == r) {
//sum[rt] += add;
sum[rt] = add;
ma[rt] = sum[rt];
return ;
}
int m = (l + r) >> 1;
if (p <= m) update(p , add , lson);
else update(p , add , rson);
PushUP(rt);
PushUP2(rt);
}
LL query(int L,int R,int l,int r,int rt) {
if (L <= l && r <= R) {
return sum[rt];
}
int m = (l + r) >> 1;
LL ret = 0;
if (L <= m) ret += query(L , R , lson);
if (R > m) ret += query(L , R , rson);
return ret;
}
int main() { int n, m, op, l, r, k;
LL x, mod;
scanf("%d%d",&n,&m);
build(1, n, 1);
while(m--)
{
scanf("%d",&op);
if(op == 1)
{
//scanf("%d%d",&l, &r);
cin >> l >> r;
cout << query(l, r, 1, n, 1) << endl;
//printf("%I64d\n",query(l, r, 1, n, 1));
}
else if(op == 2)
{
cin >> l >> r >> mod;
//scanf("%d%d%I64d",&l, &r, &mod);
MOD(l, r, 1, n, 1, mod); }
else
{
cin >> k >> x;
//scanf("%d%d",&k,&x);
update(k, x, 1, n, 1);
}
} return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforce 438D-The Child and Sequence 分类: Brush Mode 2014-10-06 20:20 102人阅读 评论(0) 收藏的更多相关文章

  1. bzoj 1041 圆上的整点 分类: Brush Mode 2014-11-11 20:15 80人阅读 评论(0) 收藏

    这里先只考虑x,y都大于0的情况 如果x^2+y^2=r^2,则(r-x)(r+x)=y*y 令d=gcd(r-x,r+x),r-x=d*u^2,r+x=d*v^2,显然有gcd(u,v)=1且u&l ...

  2. NYOJ 119 士兵杀敌(三)【ST算法】 分类: Brush Mode 2014-11-13 20:56 101人阅读 评论(0) 收藏

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=119 解题思路: RMQ算法. 不会的可以去看看我总结的RMQ算法. http://blo ...

  3. Poj 2559 最大矩形面积 v单调栈 分类: Brush Mode 2014-11-13 20:48 81人阅读 评论(0) 收藏

    #include<iostream> #include<stack> #include<stdio.h> using namespace std; struct n ...

  4. DNA Sorting 分类: POJ 2015-06-23 20:24 9人阅读 评论(0) 收藏

    DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 88690 Accepted: 35644 Descrip ...

  5. Binary Tree 分类: POJ 2015-06-12 20:34 17人阅读 评论(0) 收藏

    Binary Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6355   Accepted: 2922 Descr ...

  6. Self Numbers 分类: POJ 2015-06-12 20:07 14人阅读 评论(0) 收藏

    Self Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22101   Accepted: 12429 De ...

  7. 共享内存+互斥量实现linux进程间通信 分类: Linux C/C++ 2015-03-26 17:14 67人阅读 评论(0) 收藏

    一.共享内存简介 共享内存是进程间通信中高效方便的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针,两个进程可以对一块共享 ...

  8. OC基础知识总结 分类: ios学习 OC 2015-06-26 17:58 58人阅读 评论(0) 收藏

    //OC: Objective-C, 面向对象的C语言 //OC与C的区别 //1.OC是C的超集, C语言的所有语法都可以在OC中使用 //2.OC是面向对象 //3.OC是一门运行时语言 //4. ...

  9. OC基础:类的扩展.协议 分类: ios学习 OC 2015-06-22 19:22 34人阅读 评论(0) 收藏

    //再设计一个类的时候,有些方法需要对外公开(接口),有些仅供内部使用. 类的扩展:为类添加新的特征(属性)或者方法 对已知类: 1.直接添加 2.继承(在其子类中添加实例变量和方法) 3.使用ext ...

随机推荐

  1. 几道华为经典C语言面试题

    1.找错 void test1() { char string[10]; char* str1="0123456789"; strcpy(string, str1); } 这里st ...

  2. WPF控件数据单项绑定

    建立一个姓名,年龄输入框,如图: XAML代码: <TextBox Name="txtName" Text="{Binding Name}" ToolTi ...

  3. Python科学计算利器——Anaconda

    (搬运自我在SegmentFault的博客) 最近在用Python做中文自然语言处理.使用的IDE是PyCharm.PyCharm确实是Python开发之首选,但用于科学计算方面,还略有欠缺.为此我尝 ...

  4. 【转】Winform下KeyDown,KeyPress,KeyUp事件的总结

    http://blog.csdn.net/xiashengwang/article/details/6777907

  5. TAT 前端突击队 第四关 题目 腐蚀的画

    腐蚀的画 1.一个漂亮的画作在经过几千年岁月的洗礼下,部分地方已经被腐蚀了,像一个孤独的老人,满脸爬满了皱纹.2.但在一个晚上,老王突然发现,这些腐蚀的部分中,隐藏着岁月留下的密秘.请你帮助老王寻找这 ...

  6. Entity Framework学习笔记(三)----CRUD(2)

    请注明转载地址:http://www.cnblogs.com/arhat 昨天晚上老魏配的机器终于到了,可是拿回来之后什么都组装好了,唯独差一个非常重要的组件"电源线",老魏那个汗 ...

  7. “psp”软件需求规约

    1 系统概述 1.1 概述 该产品是基于软件开发的个人软件过程(personal software process)系统.基本信息有软件开发人员,项目经理,研发经理和管理层登录系统后根据各自的相应权限 ...

  8. responsive layout

    http://cssdeck.com/labs/7wsdvxdc http://getbootstrap.com/css/ http://getbootstrap.com/2.3.2/scaffold ...

  9. Net Core 的公共组件之 Http 请求客户端

    Net Core 的公共组件之 Http 请求客户端 想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 REST ,最常用的请求应该就是 GET 和 ...

  10. ASCII码排序

    ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符.   输入 第一行输 ...