sf

橙三吉。 提交于 2019-12-01 12:24:54
#include <bits/stdc++.h>
using namespace std;
#define M 10005
int add[M];
struct set_ren{
    int l;
    int r;
}p[M];
int minn[M],maxx[M];
void upget(int rt)
{
    minn[rt]=min(minn[rt*2],minn[rt*2+1]);
    maxx[rt]=max(maxx[rt*2],maxx[rt*2+1]);
}
void set_tu(int l,int r,int rt)
{
    if(l==r)
    {
        scanf("%d",&minn[rt]);
        maxx[rt]=minn[rt];
        return;
    }
    p[rt].l=l;p[rt].r=r;
    int mid=(l+r)/2;
    set_tu(l,mid,rt*2);
    set_tu(mid+1,r,rt*2+1);
    upget(rt);                                 //ok
}
void downget(int rt)
{
    if(add[rt]==0) return;
    add[rt*2]+=add[rt];
    add[rt*2+1]+=add[rt];
    maxx[rt*2]+=add[rt];
    minn[rt*2]+=add[rt];
    maxx[rt*2+1]+=add[rt];
    minn[rt*2+1]+=add[rt];
}
void xiugai(int l,int r,int rt,int c)
{
    if(l<=p[rt].l&&p[rt].r<=r)
    {
        add[rt]+=c;
        maxx[rt]+=c;
        minn[rt]+=c;
        return ;
    }
    if(add[rt])
     downget(rt); //shi na ge qu jian
    int mid=(p[rt].l+p[rt].r)/2;
    if(r<=mid) xiugai(l,r,rt*2,c);
    else if(l>mid) xiugai(l,r,rt*2+1,c);
    else xiugai(l,mid,rt*2,c),xiugai(mid+1,r,rt*2+1,c);
    upget(rt);
}
int max_quary(int l,int r,int rt)
{    
    if(l<=p[rt].l&&p[rt].r<=r)
    {
        return  maxx[rt];    
    }
    int ret=-0x3f3f3f;
    if(add[rt]) downget(rt);
    int mid=(p[rt].l+p[rt].r)/2;
    if(r<=mid) ret=max(ret,max_quary(l,r,rt*2));
    else if(l>mid) ret=max(ret,max_quary(l,r,rt*2+1));
    else  return max(ret,max(max_quary(l,mid,rt*2),max_quary(mid+1,r,rt*2+1)));
}
int min_quary(int l,int r,int rt)
{
    if(l<=p[rt].l&&p[rt].r<=r)
    {
        return   minn[rt];    
    }
    int ret=0x3f3f3f;
    if(add[rt]) downget(rt);
    int mid=(p[rt].l+p[rt].r)/2;
    if(r<=mid) ret=min(ret,min_quary(l,r,rt*2));
    else if(l>mid) ret=min(ret,min_quary(l,r,rt*2+1));
    else  return min(ret,min(min_quary(l,mid,rt*2),min_quary(mid+1,r,rt*2+1)));
}
int n,m,a,b,c;
int main(){
    scanf("%d%d",&n,&m);
    set_tu(1,n,1);
    for(int i=1;i<=m;i++)
    {   int z;
        scanf("%d",&z);
        if(z==1)
        {   
            scanf("%d%d",&a,&b);
            printf("%d\n",max_quary(a,b,1)-min_quary(a,b,1));
        }
        else
        {
            scanf("%d%d%d",&a,&b,&c);
            xiugai(a,b,1,c);
        }
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!