AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 其它
    • 题解
    • 分享
    • 商店
    • 问答
  • 吐槽
  • 登录/注册

树状数组区间查询区间修改板子

作者: 作者的头像   Rain丶bow ,  2023-01-25 16:16:14 ,  所有人可见 ,  阅读 94


0


#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> PII;
typedef pair<string,int> PSI;
#define f first
#define s second
#define pb push_back
const int N = 1e5+10;
int n,m;
int tr1[N],tr2[N];
int a[N];
int lowbit(int x)
{
    return x&-x;
}
void add(int tr[],int x,int c)
{
    for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=c;
}
int ask(int tr[],int x)
{
    int res=0;
    for(int i=x;i;i-=lowbit(i)) res+=tr[i];
    return res;
}
int rb(int x)
{
    return ask(tr1,x)*(x+1)-ask(tr2,x);
}
signed main()
{ 
    ios::sync_with_stdio(false);    
    cin.tie(nullptr),cout.tie(nullptr);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        int b=a[i]-a[i-1];
        add(tr1,i,b);
        add(tr2,i,i*b);
    }
    while(m--)
    {
        string op;
        int l,r,d;
        cin>>op;
        if(op=="C")
        {
            cin>>l>>r>>d;
            add(tr1,l,d),add(tr2,l,l*d);
            add(tr1,r+1,-d),add(tr2,r+1,-d*(r+1));
        }
        else
        {
            cin>>l>>r;
            cout<<rb(r)-rb(l-1)<<endl;
        }
    }
    return 0;
}

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息