社区讨论

样例未过 模版求调

P3372【模板】线段树 1参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m069ye0m
此快照首次捕获于
2024/08/23 13:32
2 年前
此快照最后确认于
2024/08/23 13:33
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define ls (now*2)
#define rs (now*2+1)
#define int long long
using namespace std;
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
const int maxn=1e5+10;
int a[maxn],tree[maxn*4],lzy[maxn*4],n;
void fun(int now,int l,int r,int k)
{
    tree[now]+=(r-l+1)*k;
    lzy[now]+=k;
}
void pushup(int now){tree[now]=tree[ls]+tree[rs];}
void pushdown(int now,int l,int r)
{
    int mid=(l+r)>>1;
    fun(ls,l,mid,lzy[now]);
    fun(rs,mid+1,r,lzy[now]);
    lzy[now]=0;
}
void update(int now,int nl,int nr,int l,int r,int k)
{
    if(r<nl || l>nr) return;
    if(nl<=l && r<=nr){fun(now,l,r,k);return;}
    pushdown(now,l,r);
    int mid=(l+r)>>1;
    update(ls,nl,nr,l,mid,k);
    update(rs,nl,nr,mid+1,r,k);
    pushup(now);
}
int query(int now,int nl,int nr,int l,int r)
{
    if(r<nl || l>nr) return 0;
    if(nl<=l && r<=nr){return tree[now];}
    pushdown(now,l,r);
    int mid=(l+r)>>1;
    return query(ls,nl,nr,l,mid)+query(rs,nl,nr,mid+1,r);
}
void build(int now,int l,int r)
{
    if(l==r)
    {
        tree[now]=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(now);
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    n=read();
    for(int i=1;i<=n;i++) a[i]=read();
    build(1,1,n);
    int m=read();
    while(m--)
    {
        int op=read();
        if(op==1)
        {
            int x=read(),y=read(),k=read();
            update(1,x,y,1,n,k);
        }
        else 
        {
            int x=read(),y=read();
            cout<<query(1,x,y,1,n)<<endl;
        }
    }
	return 0;
}


回复

0 条回复,欢迎继续交流。

正在加载回复...