hdu 1754 I Hate It 线段树-区间最值
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
const int N=200000+5;
int a[N],ans;
struct Tree
{
int left,right;
ll maxv;
}tree[4*N+10];
//建立线段树,如果是数组a1-an,可以build(1,1,n)来建立
void build(int id,int l,int r)
{
tree[id].left=l;
tree[id].right=r;
tree[id].maxv=0;
if (l==r)
{
tree[id].maxv=a[l];
}
else
{
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
tree[id].maxv=max(tree[id*2].maxv,tree[id].maxv);
tree[id].maxv=max(tree[id*2+1].maxv,tree[id].maxv);
}
}
//单点更新,id从1开始,pos为目标位置
void update(int id,int pos,ll val)
{
if (tree[id].left==tree[id].right)
tree[id].maxv=val;
else
{
tree[id].maxv=(val,tree[id].maxv);
int mid=(tree[id].left+tree[id].right)/2;
if (pos<=mid) update(id*2,pos,val);
else update(id*2+1,pos,val);
tree[id].maxv=max(tree[id*2].maxv,tree[id].maxv);
tree[id].maxv=max(tree[id*2+1].maxv,tree[id].maxv);
}
}
//查询范围内的和
void query(int id,int l,int r)
{
if (tree[id].left==l&&tree[id].right==r)
{
ans=max(tree[id].maxv,ans);
return;
}
else
{
int mid=(tree[id].left+tree[id].right)/2;
if (r<=mid) query(id*2,l,r);
else if (l>mid) query(id*2+1,l,r);
else
{
query(id*2,l,mid);
query(id*2+1,mid+1,r);
}
}
}
int main()
{
int i,n,m,x,y;
char cmd[20];
while(~scanf("%d%d",&n,&m))
{
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
for(i=0;i<m;i++)
{
scanf("%s %d %d",cmd,&x,&y);
if(cmd[0]=='Q')
{
ans=-1;
query(1,x,y);
printf("%d\n",ans);
}
else
{
update(1,x,y);
}
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/