目前理解的分块与之前相同还未得到升华。再接再厉
h学长 Orz
题意:老师比较喜欢比较学生间的成绩,这个老师就比较无聊了五差别对待,询问[ i , j ]区间内最高成绩是多少分,但是老师还会修改这个分数
给你一个n,m,n个学生的初始成绩,m个操作,询问或者修改某个学生的成绩
- 预处理
- 第 i 块的最高成绩
- 跟新
- 修改第 i 个学生的成绩,并且暴力循环此块 找出最高成绩并跟新
- 询问
- 用一个ans记录最大值,暴力判断完整块的最大值,与不完整块的每一个值,即得出答案
#include<bits/stdc++.h>
using namespace std;
const int maxn = 210000;
int s[maxn],pos[maxn],blo,num[maxn];
int n,m;
char ch[3];
void update(int x,int val){
s[x]=val;
num[pos[x]]=0;
for(int i = (pos[x]-1)*blo+1; i <=min(n,pos[x]*blo); i++){
num[pos[x]]=max(num[pos[x]],s[i]);
}
}
int query(int l,int r){
int ans=0;
for(int i = pos[l]+1; i <= pos[r]-1; i++)ans=max(ans,num[i]);
if(pos[l]!=pos[r]){
for(int i = l; i <= pos[l]*blo; i++)ans=max(ans,s[i]);
for(int i = (pos[r]-1)*blo+1; i <= r; i++)ans=max(ans,s[i]);
}
else for(int i = l; i <=r; i++ )ans=max(ans,s[i]);
return ans;
}
int main(){
while(~scanf("%d%d",&n,&m)){
blo=(int)sqrt(n*1.0);
for(int i = 1; i <= n; i++){
scanf("%d",&s[i]),pos[i]=(i-1)/blo+1;
}
for(int i = 1; i <= pos[n]; i++){
num[i]=0;
for(int j = (i-1)*blo+1; j <= min(n,i*blo); j++){
num[i]=max(num[i],s[j]);
}
}
while(m--){
int l,r;
scanf("%s",ch);
if(ch[0]=='U'){
scanf("%d%d",&l,&r);
update(l,r);
}
else if(ch[0]=='Q'){
scanf("%d%d",&l,&r);
printf("%d\n",query(l,r));
}
}
}
return 0;
}