线段树70分TLE求调
  • 板块P1531 I Hate It
  • 楼主syj2017
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/8/17 00:12
  • 上次更新2023/10/27 15:03:00
查看原帖
线段树70分TLE求调
547998
syj2017楼主2022/8/17 00:12
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const long long MAXN=2000010;
int n,m,a[MAXN],w[10*MAXN];
void build(int x,int l,int r){
    if(l==r){
        w[x]=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(x*2,l,mid);
    build(x*2+1,mid+1,r);
    w[x]=max(w[x*2],w[x*2+1]);
}
int ans=-1e9;
int query(int x,int l,int r,int L,int R){
    if(l>R||r<L) return -1;
    if(l==r) return a[l];
    if(L<=l&&r<=R){
        return w[x];
    }
    else{
        int mid=(l+r)/2;
        ans=max(ans,max(query(x*2,l,mid,L,R),query(x*2+1,mid+1,r,L,R)));
    }
    return ans;
}
void rev(int x,int u,int num,int L,int R){
    if(L<=u&&R>=u){
        w[x]=max(num,w[x]);
    }
    if(L==R) return;
    int mid=(L+R)/2;
    rev(x*2,u,num,L,mid);
    rev(x*2+1,u,num,mid+1,R);
}
int main(){
//freopen("P1531_5.in","r",stdin);
//freopen("output.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++) {
        scanf("%d",&a[i]);
    }
    build(1,1,n);
    while(m--){
        char opt;
        int x,y;
        scanf("%c%d%d",&opt,&x,&y);
        if(opt=='Q'){
            ans=-1e9;
            cout<<query(1,1,n,x,y)<<endl;
        }
        else{
            if(a[x]<y){
                a[x]=y;
                rev(1,x,y,1,n);
            }
            else rev(1,x,a[x],1,n);
        }
    }
}
2022/8/17 00:12
加载中...