80分求助
  • 板块P1531 I Hate It
  • 楼主gan1234
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/4/4 14:41
  • 上次更新2023/10/28 04:39:05
查看原帖
80分求助
632236
gan1234楼主2022/4/4 14:41

代码如下,第二个和第九个点wa了,原因是Too long 但是开o2又莫名AC了

#include<bits/stdc++.h>
#define MAX_N 2000005
using namespace std;
long long a[MAX_N],dat[MAX_N*4];
int n,m;
void build(int l,int r,int k){
    if(l==r){
        dat[k]=a[l];
        return ;
    }
    int m=(l+r)>>1;
    build(l,m,k+k);
    build(m+1,r,k+k+1);
    dat[k]=max(dat[k+k],dat[k+k+1]);
    return ;
}
void update(int x,int l,int r,int k,int z){
    if(x==l&&x==r){
        if(dat[k]<=z)
            dat[k]=z;
        return ;
    }
    int m=(l+r)>>1;
    if(x<=m)
        update(x,l,m,k+k,z);
    else if(x>m)
        update(x,m+1,r,k+k+1,z);
    dat[k]=max(dat[k+k],dat[k+k+1]);
}
long long calc(int x,int y,int l,int r,int k){
    if(x==l&&y==r)return dat[k];
    int m=(l+r)>>1;
    if(y<=m)
        return calc(x,y,l,m,k+k);
    else 
        if(x>m)
            return calc(x,y,m+1,r,k+k+1);
        else
            return max(calc(x,m,l,m,k+k),
                       calc(m+1,y,m+1,r,k+k+1));
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;n>=i;i++)
        scanf("%lld",&a[i]);
    build(1,n,1);
    char c;
    int x,y;
    for(int i=0;m>i;i++){
        scanf("%s",&c);
        if(c=='Q'){
            scanf("%d%d",&x,&y);
            printf("%lld\n",calc(x,y,1,n,1));
        }else{
            scanf("%d%d",&x,&y);
            update(x,1,n,1,y);
        }
    }
    return 0;
}
2022/4/4 14:41
加载中...