最大值

题目描述
在N(1<=N<=100000)个数A1…An组成的序列上进行M(1<=M<=100000)次操作,操作有两种:

(1)1 x y:表示修改A[x]为y;

(1)2 x y:询问x到y之间的最大值。
输入
第一行输入N(1<=N<=100000),表示序列的长度,接下来N行输入原始序列;接下来一行输入M(1<=M<=100000)表示操作的次数,接下来M行,每行为1 x y或2 x y
输出
对于每个操作(2)输出对应的答案。
样例输入
5

1

2

3

4

5

3

2 1 4

1 3 5

2 2 4

样例输出
4

5

数据范围限制
提示
【限制】

保证序列中的所有的数都在longint范围内

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a,v[300000],c,d,e,g,i,j,k,ans,x;
double b;
int main()
{
	scanf("%d",&a);
	b=log(a)/log(2);
	if (b!=trunc(b)) 
		c=trunc(b)+1;
	e=1;
	for (d=1;d<=c;d++)
	{
		e=e*2;
	}
	for (g=1;g<=a;g++)
		scanf("%d",&v[g+e]);
	for (g=e-1;g>=1;g--)
		v[g]=max(v[g*2],v[g*2+1]);
	v[0]=-2147483647;
	scanf("%d",&c);
	for (g=1;g<=c;g++)
	{
		scanf("%d%d%d",&i,&j,&k);
		ans=-2147483647;
		if (i==1)
		{
			j=j+e;
        	v[j]=k;
        	while (j!=0)
        	{
                j=j/2;
                v[j]=max(v[j*2],v[j*2+1]);
        	}
		}
		if (i==2)
		{
			j=j+e-1;
        	k=k+e+1;
        	while ((j xor k)!=1) 
        	{
                if (j%2==0) 
					ans=max(ans,v[j+1]);
                if (k%2==1) 
					ans=max(ans,v[k-1]);
                j=j/2;
                k=k/2;
        	}
        	printf("%d\n",ans);
    	}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值