线段树 RE 0分 求助!
查看原帖
线段树 RE 0分 求助!
476767
羊叫兽同学楼主2022/6/15 15:50

rt

#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
int n,m,s,l,i,j,f[10000000],x,y;
char kind;
struct tree
{
    int l,r,ma;
}a[10000000];
void build(int l,int r,int p)
{
    a[p].l=l;
    a[p].r=r;
    if(l==r)
    {
        a[p].ma=f[l];
        return ;
    }
    int mid=(l+r)/2;
    build(l,mid,p*2);
    build(mid+1,r,p*2+1);
    a[p].ma=max(a[p*2].ma,a[p*2+1].ma);
    return ;
}
void change(int x,int d,int p)
{
    if(a[p].l==a[p].r)
    {
        a[p].ma=d;
        return ;
    }
    int mid=(a[p].l+a[p].r)/2;
    if(x<=mid)
        change(x,d,p*2);
    else
        change(x,d,p*2+1);
    a[p].ma=max(a[p*2].ma,a[p*2+1].ma);
    return ;
}
int ask(int l,int r,int p)
{
    if(l<=a[p].l&&a[p].r<=r)
        return a[p].ma;
    int mid=(a[p].l+a[p].r/2),ans=-1;
    if(l<=mid)
        ans=max(ans,ask(l,r,p*2));
    if(mid+1<=r)
        ans=max(ans,ask(l,r,p*2+1));
    return ans;
}
signed main()
{
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&f[i]);
    build(1,n,1);
    for(i=1;i<=m;i++)
    {
        cin>>kind;
        scanf("%d%d",&x,&y);
        if(kind=='Q')
            printf("%d\n",ask(x,y,1));
        else
        {
            if(f[x]<y)
            {
                f[x]=y;
                change(x,y,1);
            }
        }
    }
}
2022/6/15 15:50
加载中...