题目描述
有n个格子,从左到右放成一排,编号为1-n。
共有m次操作,有3种操作类型:
1.修改一个格子的权值,
2.求连续一段格子权值和,
3.求连续一段格子的最大值。
对于每个2、3操作输出你所求出的结果。
输入
输入第一行两个整数,n表示格子个数,m表示操作次数,n和m中间用空格隔开; 接下来输入n行,每行一个整数表示一个格子的权值 接下来输入m行,每行有三个整数,中间用空格隔开;第一个是选择的操作类型1-3,第二和第三个整数是操作格子的编号。
| 样例输入 3 3 7 8 9 2 1 3 3 1 3 2 1 2 |
输出
若执行1操作则无输出 若执行2和3操作则输出一个整数
| 样例输出
24 9 15
|
时间限制C/C++语言:2000MS其它语言:4000MS | 内存限制C/C++语言:65536KB其它语言:589824KB |
#include<iostream>
#include<vector>
using namespace std;
struct operation{
int opt;
int first;
int end;
};
int change(int* a,int num,int value){
a[num - 1] = value;
return 0;
}
int add(int *a,int first,int end){
int kk=0;
for (int i = first - 1; i < end;i++){
kk += a[i];
}
return kk;
}
int maxVal(int *a, int first, int end){
int kk = a[first - 1];
for (int i = first; i < end; i++){
kk = (a[i]>kk?a[i]:kk);
}
return kk;
}
int main(){
int n, m;
while (cin>>n>>m){
int *data=new int[n];
for (int i = 0; i < n; i++){
cin >> data[i];
}
vector<operation>opts;
for (int i = 0; i < m;i++){
operation option;
cin >> option.opt >> option.first >> option.end;
opts.push_back(option);
}
for (int i = 0; i < m; i++){
if (opts[i].opt==1){
change(data, opts[i].first, opts[i].end);
}
else if (opts[i].opt == 2){
cout << add(data, opts[i].first, opts[i].end) << endl;
}
else if (opts[i].opt == 3){
cout << maxVal(data, opts[i].first, opts[i].end) << endl;
}
}
}
return 0;
}