问题描述
有 n 个格子,从左到右放成一排,编号为 1-n。
共有 m 次操作,有 3 种操作类型:
1.修改一个格子的权值,
2.求连续一段格子权值和,
3.求连续一段格子的最大值。
对于每个 2、3 操作输出你所求出的结果。
输入格式
第一行 2 个整数 n,m。
接下来一行 n 个整数表示 n 个格子的初始权值。
接下来 m 行,每行 3 个整数 p,x,y,p 表示操作类型,p=1 时表示修改格子 x
的权值为 y,p=2 时表示求区间[x,y]内格子权值和,p=3 时表示求区间[x,y]内格子最大的
权值。
输出格式
有若干行,行数等于 p=2 或 3 的操作总数。
每行 1 个整数,对应了每个 p=2 或 3 操作的结果。
样例输入
4 3
1 2 3 4
2 1 3
1 4 3
3 1 4
样例输出
6
3
代码实现
#include<stdio.h>
void xiugai(int *a,int n,int x,int y) //修改函数
{
for(int i=0;i<n;i++)
{
if(a[i]==x)
a[i]=y;
break;
}
}
void sum(int *a,int n,int x,int y) //求和函数
{ int s=0;
int b,c;
for(int i=0;i<n;i++)
{
if(a[i]==x)
b=i;
if(a[i]==y)
c=i;
}
for(int j=b;j<=c;j++)
s=s+a[j];
printf("%d\n",s);
}
void max(int *a,int n,int x,int y) //求最大值函数
{
int f,g;
int m=-1;
for(int i=0;i<n;i++)
{
if(a[i]==x)
f=i;
if(a[i]==y)
g=i;
}
for(int j=f;j<=g;j++)
{
if(a[j]>m)
m=a[j];
}
printf("%d\n",m);
}
int main()
{
int a[100];
int p[100],x[100],y[100];
int n,m;
printf("请输入:");
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int j=0;j<m;j++)
{
scanf("%d%d%d",&p[j],&x[j],&y[j]);
}
for(int k=0;k<m;k++)
{
if(p[k]==1)
xiugai(a,n,x[k],y[k]);
if(p[k]==2)
sum(a,n,x[k],y[k]);
if(p[k]==3)
max(a,n,x[k],y[k]);
}
return 0;
}
来源:CSDN
作者:matchless_QYW
链接:https://blog.csdn.net/matchless_QYW/article/details/104563856