姜同学在生日派对上收到了一个整数数组
A
A,他决定对其执行一些操作。
从形式上看,他要依次执行的操作有
Q
Q 个。每个操作的输入都属于下面三种类型之一:
1 l r:对于数组中下标介于
l
l 和
r
r 之间(包括
l
l 和
r
r)的元素,数值均增加
1
1。
-1 l r:对于数组中下标介于
l
l 和
r
r 之间(包括
l
l 和
r
r)的元素,数值均减少
1
1。
0,输出当前数组的最大值。
例如,如果初始数组为
[
1
,
2
,
3
,
2
,
1
]
[1,2,3,2,1],执行操作 1 1 3 后,数组为
[
2
,
3
,
4
,
2
,
1
]
[2,3,4,2,1];然后,在执行操作 -1 2 3 之后,得到数组
[
2
,
2
,
3
,
2
,
1
]
[2,2,3,2,1]。
输入格式
第一行包含两个整数
N
N 和
Q
Q,表示数组的长度和操作个数;
第二行包含数组的
N
N 个整数
A
i
A
i
,以空格分隔;
然后是
Q
Q 行,每行对应一个操作。
输出格式
仅对于第三种操作,需要输出当前数组的最大值(注意换行)。
数据范围
对于
30
%
30% 的数据,
N
,
Q
≤
1000
N,Q≤1000。
对于另外
30
%
30% 的数据,
N
,
Q
≤
30000
N,Q≤30000。
对于另外
30
%
30% 的数据,
N
,
Q
≤
2
×
10
5
N,Q≤2×10
5
, 且
Q
Q次操作中,第三种操作的次数
≤
10
≤10。
对于
100
%
100% 的数据,
1
≤
N
,
Q
≤
2
×
10
5
1≤N,Q≤2×10
5
,
1
≤
A
i
≤
10
9
1≤A
i
≤10
9
,
1
≤
l
≤
r
≤
2
×
10
5
1≤l≤r≤2×10
5
。
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[1000005],c[1000005],t[1000005],l,r;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
c[i]=a[i]-a[i-1];
}
int x;
for(int i=1;i<=m;i++){
scanf("%d",&x);
if(x!=0){
cin>>l>>r;
c[l]+=x;
c[r+1]-=x;
}else{
long long mx=0;
for(int i=1;i<=n;i++){
t[i]=c[i]+t[i-1];
mx=max(mx,t[i]);
}
printf("%lld\n",mx);
}
}
return 0;
}
超时怎么办