线段树9pts求调
查看原帖
线段树9pts求调
1023189
wangtairan114楼主2024/5/9 20:24
#include <bits/stdc++.h>
using namespace std;
#define min(a,b) ((a)>(b)?(b):(a))
#define max(a,b) ((a)<(b)?(b):(a))
#define INF 0x3f3f3f3f
#define ll long long
#define sc scanf
#define pr printf
#define v1 first
#define v2 second
#define f(nm1,nm2,nm3) for(int nm1=nm2; nm1<= nm3; nm1++)
#define lowbit(x) (x&(-x))
#define int long long
#define lson k*2,l,mid
#define rson k*2+1,mid+1,r
const int sz=100005;
int nowl,nowr,lazy[sz*4],val[sz*4],a[sz],n,m,maxn[sz*4];
void build(int k,int l,int r)
{
    if(l==r)
    {
        val[k]=max(0,a[l]);
        maxn[k]=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(lson);
    build(rson);
    val[k]=val[k*2]+val[k*2+1];
    maxn[k]=max(maxn[k*2],maxn[k*2+1]);
}

ll query(int k,int l,int r)
{
    if(nowl<=l&&r<=nowr)
        return val[k];
    int mid=(l+r)>>1,ans=0;
    if(nowl<=mid)
        ans+=query(lson);
    if(nowr>mid)
        ans+=query(rson);
    return ans;
}
ll query2(int k,int l,int r)
{
    if(nowl<=l&&r<=nowr)
        return maxn[k];
    int mid=(l+r)>>1,ans=-1e18;
    if(nowl<=mid)
        ans=max(ans,query2(lson));
    if(nowr>mid)
        ans=max(ans,query2(rson));
    return ans;
}
void add(int k,int l,int r,int x)
{
    if(nowl<=l&&r<=nowr)
    {
        maxn[k]=x;
        val[k]=max(x,0);
        return;
    }
    int mid=(l+r)>>1;
    if(nowl<=mid)
        add(lson,x);
    if(nowr>mid)
        add(rson,x);
    val[k]=val[k*2]+val[k*2+1];
    maxn[k]=max(maxn[k*2],maxn[k*2+1]);
}
signed main()
{
    sc("%lld%lld",&n,&m);
    for(int i=1; i <= n; i++)
        sc("%lld",&a[i]);
    build(1,1,n);
    while(m--)
    {
        int op;
        sc("%lld%lld%lld",&op,&nowl,&nowr);
        if(op==1)
        {
            if(nowl>nowr)
                swap(nowl,nowr);
            int res1=query(1,1,n);
            int res2=query2(1,1,n);
            if(res2<0)
                pr("%lld\n",res2);
            else
                pr("%lld\n",res1);
        }
        else
        {
            int s=nowr;
            nowr=nowl;
            add(1,1,n,s);
        }
    }
    return 0;
}

2024/5/9 20:24
加载中...