我想起喷泉旁的白鸽|

Arthur_Douglas

园龄:1年4个月粉丝:3关注:3

P3374 【模板】树状数组 1

part1

#include<bits/stdc++.h> 
#define int long long
using namespace std;
struct  node1{int l,r,value;};
node1 node[2000020];
int a[500010];
void mt(int p,int l,int r)
{
    int mid=(l+r)>>1;
    node[p].l=l;
    node[p].r=r;
    if(l==r)
    {
        node[p].value=a[l];
        return;
    }
    mt(p<<1,l,mid);
    mt(p<<1|1,mid+1,r);
    node[p].value=node[p<<1].value+node[p<<1|1].value;
}
int findNum(int p, int l, int r)
{
    if(node[p].l==l&&node[p].r==r)return node[p].value;
    int mid=(node[p].l+node[p].r)>>1;
    if(r<=mid)return findNum(p<<1,l,r);
    if(l>mid)return findNum(p<<1|1,l,r);
    return findNum(p<<1,l,mid)+findNum(p<<1|1,mid+1,r);
}
void at(int i, int x)
{
    int p=1;
    while(1)
    {
        node[p].value+=x;
        if(node[p].l==node[p].r) break;
        int mid=(node[p].l+node[p].r)>>1;
        p<<=1;
        if(i>mid)p|=1;
    }
    return;
}
int n,m,x,y,z;
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;++i)cin >> a[i];
    mt(1,1,n);
    for(int i=1;i<=m;i++){
    	cin>>x>>y>>z;
    	if(x==1) at(y,z);
    	if(x==2) cout<<findNum(1,y,z)<<endl;
	}
	return 0;
}

part2

#include<bits/stdc++.h>
#define int long long
using namespace std;
int lowbit(int num){
	return num&-num;
}
int n,m,t,z,x,y,a[500010],d[500010];
int get(int num){
       int ans=0;
       while(num!=0)
       {
            ans+=d[num];
            num-=lowbit(num);
        }
        return ans;
}
 void add(int x,int k)
    {
        while(x<=n)
        {
            d[x]+=k;
            x+=lowbit(x);
        }
    }
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		add(i,a[i]);
	} 
	for(int i=1;i<=m;i++){
		cin>>z>>x>>y;
		if(z==1){
			 add(x,y);	
		}
		if(z==2){
			cout<<get(y)-get(x-1)<<endl;
		}
	}
	return 0;
}
posted @   Arthur_Douglas  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起