我和树状数组是八字不合吗?就没做对过……
查看原帖
我和树状数组是八字不合吗?就没做对过……
776799
GODTREE楼主2022/11/5 20:08
#include <bits/stdc++.h>
using namespace std;
int in[1000001],bit[1000001];
int lowbit(int x)//查找x二进制中第一个1 
{
    return x&(-x);
}
int sum(int x)
{
   int ans=0;
   while(x!=0)
   {
      ans+=bit[x];
      x-=lowbit(x);
   }
   return ans;
}
int main()
{
    int n,m;
    cin>>n>>m;

    for (int i=1;i<=n;i++)//将bit初始化为0 
    {
        bit[i]=0;
    }
    for (int i=1;i<=n;i++)
    {
        cin>>in[i];
        bit[i]+=in[i];
        int j=i;
        while (j<=n)//存入树状数组 
        {
            j+=lowbit(j);
            bit[j]+=in[i];
        }
    }
    for (int i=1;i<=m;i++)
    {
        int b,x,y;
        cin>>b>>x>>y;
        if (b==1)
        {
            int k;
            cin>>k;
            for (int j=x;j<=y;j++)
            {
                bit[j]+=k;
                in[j]+=k;
                int r=j;
                while (r<=n)//修改值 
                {
                    r+=lowbit(r);
                    bit[r]+=y;
                }
            }
        }
        else
        {
            if (x==y)
            {
                cout<<in[x]<<endl;
                continue;
            }
            cout<<sum(y)-sum(x-1)<<endl;
        }
    }
    return 0;
} 
2022/11/5 20:08
加载中...