树状数组

单点修改区间查询

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e7+5;
#define int long long
int a[maxn],n,m;
inline int lowbit(int x)
{
    return x&(-x);
}
struct node
{
    int tr[maxn];
    int add(int x,int y)
    {
        for(int i=x;i<=n;i+=lowbit(i))
        tr[i]+=y; 
    }
    int qu(int x)
    {
        int res=0;
        for(int i=x;i;i-=lowbit(i))
        {
            res+=tr[i];
        }
        return res;
    }
}bit;

signed main()
{
    int x,k,opt;
    cin>>n>>m;
    for(int i=1;i<=n;i++) 
    {
        cin>>a[i];
        bit.add(i,a[i]);
    }
    for(int i=1;i<=m;i++)
    {
        cin>>opt>>x>>k;
        if(opt==1)
        {
            bit.add(x,k);
        }
        else
        {
            cout<<bit.qu(k)-bit.qu(x-1)<<endl;
        }
    }
    return 0;
}

其实不难看出,核心部分是下面的代码

code
 inline int lowbit(int x)
{
    return x&(-x);
}
struct node
{
    int tr[maxn];
    int add(int x,int y)
    {
        for(int i=x;i<=n;i+=lowbit(i))
        tr[i]+=y; 
    }
    int qu(int x)
    {
        int res=0;
        for(int i=x;i;i-=lowbit(i))
        {
            res+=tr[i];
        }
        return res;
    }
}bit;

 bytoj  ybtoj上有一道题涉及到离散化,否则日爆

int p[maxn];
	for(int i=1;i<=n;i++)
	{
		p[i]=a[i];
	}
	sort(p+1,p+n+1);
	int tot = unique(p+1,p+1+n)-1-p;
	for(int i=1;i<=n;i++)
	{
		a[i]=lower_bound(p+1,p+1+tot,a[i])-p;
	}

 

posted @ 2024-03-16 17:58  类人群星闪耀时  阅读(6)  评论(0编辑  收藏  举报