RMQ操作线段树

#include <iostream>
#include <bits/stdc++.h>
#define maxn 800005
using namespace std;
typedef long long ll;
ll tree[maxn]={0};
ll lazy[maxn]={0};
ll a[200005]={0};
int n;
void pushup(int rt)
{
    tree[rt]=max(tree[rt*2],tree[rt*2+1]);
}
void buildtree(int l,int r,int rt)
{
    if(l==r)
    {
        tree[rt]=a[l];
        return;
    }
    int mid=(l+r)/2;
    buildtree(l,mid,rt*2);
    buildtree(mid+1,r,rt*2+1);
    pushup(rt);
}
void pushdown(int rt)
{
    if(lazy[rt])
    {
        lazy[rt*2]+=lazy[rt];
        lazy[rt*2+1]+=lazy[rt];
        tree[rt*2]+=lazy[rt];
        tree[rt*2+1]+=lazy[rt];
        lazy[rt]=0;
    }
}
void add(int l,int r,int L,int R,int rt,int val)
{
    if(L<=l&&R>=r)
    {
        lazy[rt]+=val;
        tree[rt]+=val;
        return;
    }
    if(lazy[rt]) pushdown(rt);
    int mid=(l+r)/2;
    if(L<=mid) add(l,mid,L,R,rt*2,val);
    if(R>mid) add(mid+1,r,L,R,rt*2+1,val);
    pushup(rt);
}
ll query(int l,int r,int L,int R,int rt)
{
    if(L<=l&&R>=r)
    {
        return tree[rt];
    }
    int mid=(l+r)/2;
    pushdown(rt);
    ll ret=1e9;
    if(L<=mid) ret=query(l,mid,L,R,rt*2);
    if(R>mid) ret=max(ret,query(mid+1,r,L,R,rt*2+1));
    return ret;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    buildtree(1,n,1);
    int m;
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {   char c;
        scanf("%c",&c);
        if(c=='a')
        {
            int x,y,val;
            scanf("%d%d%d",&x,&y,&val);
            add(1,n,x,y,1,val);
        }
        else if(c=='q')
        {
            int x,y;
            scanf("%d%d",&x,&y);
            cout<<query(1,n,x,y,1)<<endl;
        }
    }
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/zyf3855923/p/9069372.html