70WA求助!
  • 板块P1531 I Hate It
  • 楼主Lvyuze
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/8/18 09:59
  • 上次更新2023/10/27 14:50:01
查看原帖
70WA求助!
541408
Lvyuze楼主2022/8/18 09:59
#include<bits/stdc++.h>
using namespace std;
int a[100001],n,m,x,y,ans;
string op;
int tree[400004];
inline void build(int k,int ll,int rr){
    if(ll==rr){
        tree[k]=a[ll];
        return;
    }
    int m=(ll+rr)/2;
    build(k*2,ll,m);
    build(k*2+1,m+1,rr);
    tree[k]=max(tree[k*2],tree[k*2+1]);
}
inline void change_point(int k,int ll,int rr,int x,int y){
    if(ll==rr){
        if(tree[k]<y) tree[k]=y;
        return;
    }
    int m=(ll+rr)/2;
    if(x<=m) change_point(k*2,ll,m,x,y);
    else change_point(k*2+1,m+1,rr,x,y);
    tree[k]=max(tree[k*2],tree[k*2+1]);
}
int ask_interval(int k,int ll,int rr,int x,int y){
    if(x<=ll&&rr<=y) return tree[k];
    int m=(ll+rr)/2,ans=-1e9;
    if(x<=m) ans=max(ans,ask_interval(k*2,ll,m,x,y));
    if(y>m) ans=max(ans,ask_interval(k*2+1,m+1,rr,x,y));
	return ans;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    build(1,1,n);
    for(int i=1;i<=m;i++){
        cin>>op;
        if(op=="Q"){
            scanf("%d%d",&x,&y);
            printf("%d\n",ask_interval(1,1,n,x,y));
        }
        else{
            scanf("%d%d",&x,&y);
            change_point(1,1,n,x,y);
        }
    }
    return 0;
}

还有一个问题,区间询问的 ans 变量改到 m 的赋值后面就可以对一些点,但如果重开一行就不行,这是为何?

2022/8/18 09:59
加载中...