代码康复训练

发布时间 2023-09-12 21:27:31作者: Varuxn

树状数组区间求和P3374

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10;
int n,m;
struct BIT
{
    int lim,tre[N];
    inline int lowbit(int x){return x&(-x);}
    inline void insert(int x,int val){for(int i=x;i<=lim;i+=lowbit(i))tre[i]+=val;}
    inline int query(int x){int temp=0;for(int i=x;i>0;i-=lowbit(i))temp+=tre[i];return temp;}
    inline int query(int l,int r){return query(r)-query(l-1);}
}T;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
#undef int
int main()
{
    #define  int long long
    T.lim=n=read(); m=read();
    for(int i=1,x;i<=n;i++) x=read(),T.insert(i,x);
    for(int i=1,opt,x,y;i<=m;i++)
    {
        opt=read(); x=read(); y=read();
        if(opt==1) T.insert(x,y);
        else printf("%lld\n",T.query(x,y));
    }
    return 0;
}

树状数组区间加P3368

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10;
int n,m;
struct BIT
{
    int lim,tre[N];
    inline int lowbit(int x){return x&(-x);}
    inline void insert(int x,int val){for(int i=x;i<=lim;i+=lowbit(i))tre[i]+=val;}
    inline void insert(int l,int r,int val){insert(l,val);insert(r+1,-val);}
    inline int query(int x){int temp=0;for(int i=x;i>0;i-=lowbit(i))temp+=tre[i];return temp;}
}T;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
#undef int
int main()
{
    #define  int long long
    T.lim=n=read(); m=read();
    for(int i=1,x;i<=n;i++) x=read(),T.insert(i,i,x);
    for(int i=1,opt,x,y,k;i<=m;i++)
    {
        opt=read(); x=read();
        if(opt==1) y=read(),k=read(),T.insert(x,y,k);
        else printf("%lld\n",T.query(x));
    }
    return 0;
}