Fork me on GitHub

线段树

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                    

 

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1000010
using namespace std;
int n,m,a[N];
int mx[N*4],mn[N*4];
void pushup(int k)
{
    mx[k]=max(mx[k*2],mx[k*2+1]);
    mn[k]=min(mn[k*2],mn[k*2+1]);
}
void build(int k,int l,int r)
{
    if(l==r)
    {
        mx[k]=mn[k]=a[l];
        return;
    }
    int mid=l+r>>1;
    build(k*2,l,mid);
    build(k*2+1,mid+1,r);
    pushup(k);
}
int ask_max(int k,int l,int r,int z,int y)
{
    if(l==z&&r==y) return mx[k];
    int mid=l+r>>1;
    if(y<=mid) return ask_max(k*2,l,mid,z,y);
    if(z>mid) return ask_max(k*2+1,mid+1,r,z,y);
    return max(ask_max(k*2,l,mid,z,mid),
            ask_max(k*2+1,mid+1,r,mid+1,y));
}
int ask_min(int k,int l,int r,int z,int y)
{
    if(l==z&&r==y) return mn[k];
    int mid=l+r>>1;
    if(y<=mid) return ask_min(k*2,l,mid,z,y);
    if(z>mid) return ask_min(k*2+1,mid+1,r,z,y);
    return min(ask_min(k*2,l,mid,z,mid),
            ask_min(k*2+1,mid+1,r,mid+1,y));
}
void change(int k,int l,int r,int x)
{
    if(l==r)
    {
        mx[k]=mn[k]=a[l];
        return;
    }
    int mid=l+r>>1;
    if(x<=mid) change(k*2,l,mid,x);
    else change(k*2+1,mid+1,r,x);
    pushup(k);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    build(1,1,n);
    while(m--)
    {
        int l,r;
        cin>>l>>r;
        int ans=ask_max(1,1,n,l,r)-ask_min(1,1,n,l,r);
        cout<<ans<<endl;
    }
}
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1000010
using namespace std;
int n,m,a[N];
int sum[N*4],len[N*4],ad[N*4];
void pushup(int k)
{
    sum[k]=sum[k*2]+sum[k*2+1];
    len[k]=len[k*2]+len[k*2+1];
}
void A(int k,int x)
{
    sum[k]+=x*len[k];
    ad[k]+=x;
}
void pushdown(int k)
{
    A(k*2,ad[k]);
    A(k*2+1,ad[k]);
    ad[k]=0;
}
void build(int k,int l,int r)
{
    if(l==r)
    {
        sum[k]=a[l];
        len[k]=1;
        return;
    }
    int mid=l+r>>1;
    build(k*2,l,mid);
    build(k*2+1,mid+1,r);
    pushup(k);
}
int ask_sum(int k,int l,int r,int z,int y)
{
    if(l==z&&r==y) return sum[k];
    if(ad[k]) pushdown(k);
    int mid=l+r>>1;
    if(y<=mid) return ask_sum(k*2,l,mid,z,y);
    if(z>mid) return ask_sum(k*2+1,mid+1,r,z,y);
    return ask_sum(k*2,l,mid,z,mid)+
            ask_sum(k*2+1,mid+1,r,mid+1,y);
}
void change(int k,int l,int r,int z,int y,int x)
{
    if(l==z&&r==y)
    {
        A(k,x);
        return;
    }
    if(ad[k]) pushdown(k);
    int mid=l+r>>1;
    if(y<=mid) change(k*2,l,mid,z,y,x);
    else if(z>mid) change(k*2+1,mid+1,r,z,y,x);
    else
    {
        change(k*2,l,mid,z,mid,x);
        change(k*2+1,mid+1,r,mid+1,y,x);
    }
    pushup(k);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    build(1,1,n);
    cin>>m;
    while(m--)
    {
        int op,a,b,x;
        cin>>op>>a>>b;
        if(op==1)
        {
            cin>>x;
            change(1,1,n,a,b,x);
        }
        else
        {
            int ans=ask_sum(1,1,n,a,b);
            cout<<ans<<endl;
        }
    }
}
posted @ 2020-01-18 20:48  liusu123456  阅读(83)  评论(0编辑  收藏  举报