线段树9分求助,悬关。

P4513 小白逛公园

jiangjiangQwQ @ 2023-08-05 20:53:31

求助。

#include<iostream>
using namespace std;
#define int long long
const int N=1e6+5;
struct node{
    int l,r,Max,val;
}t[N<<2];
#define ls(c) c<<1
#define rs(c) c<<1|1
inline void build(int c,int l,int r){
    t[c].l=l;t[c].r=r;
    if(l==r){
        cin>>t[c].val;
        t[c].Max=t[c].val;
        return ;
    }int mid=(l+r)>>1;
    build(ls(c),l,mid);
    build(rs(c),mid+1,r);
    t[c].Max=max(t[ls(c)].Max,t[rs(c)].Max);
    return;
}inline void change(int c,int l,int r,int k){
    if(l<=t[c].l&&r>=t[c].r){
        t[c].val=k;
        t[c].Max=k;
        return ;
    }//down(c);
    int mid=(t[c].l+t[c].r)>>1;
    if(l<=mid) change(ls(c),l,r,k);
    if(r>mid) change(rs(c),l,r,k);
    t[c].Max=max(t[ls(c)].Max,t[rs(c)].Max);
    return;
}int query(int c,int l,int r){
    if(l<=t[c].l&&r>=t[c].r) return t[c].Max;
    int mid=(t[c].l+t[c].r)>>1,ans=114514;
    if(l<=mid) ans=(ans==114514?query(ls(c),l,r):max(ans,query(ls(c),l,r)));
    if(r>mid) ans=(ans==114514?query(rs(c),l,r):max(ans,query(rs(c),l,r)));
    return ans=(ans==114514?-1e9:ans);
}int n,m,op,l,r,k,p,s;
signed main(){
    ios::sync_with_stdio(0);
    cin.tie();cout.tie();
    cin>>n>>m;
    build(1,1,n);
    while(m--){
        cin>>op;
        if(op==1) cin>>l>>r,cout<<query(1,min(l,r),max(l,r))<<'\n';
        else cin>>p>>s,change(1,p,p,s);
    }
    return 0;
}/*
50 100
773
760
-578
-302
-664
272
367
352
891
-569
429
-208
-325
38
148
456
-960
-390
470
271
763
-458
-52
647
-205
-514
399
-611
882
665
257
-718
233
-756
237
-301
650
148
-894
-212
-820
-341
-240
-620
320
932
-498
-252
323
-428
2 5 818
1 35 49
2 15 -87
1 31 48
1 44 37
1 10 25
2 28 -761
2 38 913
1 28 30
1 25 38
2 26 996
1 35 22
2 27 59
2 49 -754
2 7 -366
2 3 -822
1 22 3
2 12 516
1 7 30
2 5 -693
2 22 -193
2 33 -474
1 1 3
1 37 35
2 39 829
2 28 865
1 37 20
1 38 42
1 17 5
1 38 5
2 41 -553
1 18 9
1 18 16
2 48 -20
2 10 -875
1 20 13
1 38 1
1 15 44
2 36 -247
1 11 32
2 18 -703
2 47 -24
1 39 15
1 9 2
1 7 32
1 36 6
2 19 253
2 40 -624
1 12 45
1 25 37
1 4 3
1 40 27
1 28 45
2 6 -851
2 10 410
1 31 48
2 25 -307
2 27 -704
1 25 7
1 35 12
1 17 24
1 29 21
1 15 5
2 18 -70
2 17 568
1 12 45
2 13 -276
2 21 -862
2 47 -513
2 24 -700
1 10 42
1 26 15
2 27 238
2 39 -264
1 10 8
2 8 -5
1 33 34
2 23 665
2 38 -646
1 8 35
2 1 -834
2 2 -908
2 3 -702
2 4 -994
2 5 -883
1 1 1
1 2 2
1 3 3
1 4 4
1 5 5
1 2 1
1 3 2
1 4 3
1 5 4
1 3 1
1 4 2
1 5 3
1 4 1
1 5 2
1 5 1

*/

by Kalium @ 2023-08-05 21:17:23

最大区间可能都在左区间,都在右区间,也可能左右雨露均沾。

但是感觉您应该只有判断都在左和都在右吧。

@Super_excavator


by jiangjiangQwQ @ 2023-08-08 10:55:31

@Kalium 我是看错题了,已经A了。Thanks♪(・ω・)ノ


|