又是一道线段树。。。
题意大概是。
有N个学生 每个学生都有一个成绩。
然后他会更新某个学生的成绩或者是询问I到J个学生之间的最大成绩
我的思路: 也是先建立线段树。
每个区间保存的是该区间内的最大分数。
更新的时候就只需要判断该值是否为最大值。如果是就更新。
否则不更新。
询问的时候也是老样子。
搜索区间I J
知道匹配到I J的子区间 就更新他的最大值= =
然后输出最大值就是了。。
贴上代码。。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int m;
int a[2000000];
struct tree{
int left;
int right;
int fenshu;
}tree[8000000];
void inset(int inst,int le,int ri)
{
tree[inst].left=le;
tree[inst].right=ri;
tree[inst].fenshu=0;
if(le==ri) return ;
int mid=(le+ri)>>1;
inset(2*inst,le,mid);
inset(2*inst+1,mid+1,ri);
}
void U(int inst,int k,int p)
{
if(k==tree[inst].left&&k==tree[inst].right)
{
tree[inst].fenshu=p;
return;
}
if(k>=tree[inst].left&&k<=tree[inst].right)
{
if(tree[inst].fenshu<p)
tree[inst].fenshu=p;
}
int mid=(tree[inst].left+tree[inst].right)>>1;
if(k<=mid)
U(2*inst,k,p);
else U(2*inst+1,k,p);
}
void Q(int inst,int le,int ri)
{ //cout<<1<<endl;
if(tree[inst].left==le&&tree[inst].right==ri)
{
m=max(m,tree[inst].fenshu);
return ;
}
int mid=(tree[inst].left+tree[inst].right)>>1;
if(ri<=mid)
Q(2*inst,le,ri);
else if(le>mid)
Q(2*inst+1,le,ri);
else
{
Q(2*inst,le,mid);
Q(2*inst+1,mid+1,ri);
}
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{ inset(1,1,n);
// cout<<n<<" "<<k<<endl;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
// cout<<a[i]<<endl;
U(1,i+1,a[i]);
}
while(k--)
{char c[10];
int g,h;
scanf("%s",c);
scanf("%d%d",&g,&h);
// printf("%s %d %d\n",c,g,h);
// cout<<g<<" "<<h<<endl;
if(strcmp(c,"Q")==0)
{ m=0;
Q(1,g,h);
printf("%d\n",m);
}
else if(strcmp(c,"U")==0)
U(1,g,h);
}
}
}