标签:图片 log pre 证明 include 单点 owb loading 增加
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5+7;
int a[maxn];
int c[maxn]={0};
inline int lowbit(int x)
{
return x&(-x);
}
int query(int x)///区间求和
{
int sum=0;
while (x>0)
{
sum+=c[x];
x=x-lowbit(x);
}
return sum;
}
void modify(int idx,int math,int k)///修改 k是边界 idx修改地址 math修改值,修改一个节点
{
while (idx<=k)
{
c[idx]+=math;
idx+=lowbit(idx);
}
}
int all(int a,int b)///区间查询
{
return query(b)-query(a-1);
}
int main()
{
int n,m,x;
scanf("%d%d",&n,&m);
int a,b,c;
for (int i=1;i<=n;++i)
{
scanf("%d",&x);
modify(i,x,n);
}
while (m--)
{
scanf("%d%d%d",&a,&b,&c);
if (a==1)
{
modify(b,c,n);
}
else if (a==2)
{
cout<<all(b,c)<<endl;
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5+7;
int A[maxn]={0};///储存数组
int B[maxn]={0};///树状数组
int C[maxn]={0};///差分数组
inline int lowbit(int x)
{
return x&(-x);
}
int query(int x)///和上面的操作一样
{
int sum=0;
while (x>0)
{
sum+=B[x];
x=x-lowbit(x);
}
return sum;
}
void modify(int idx,int math,int k)
{
while (idx<=k)
{
B[idx]+=math;
idx+=lowbit(idx);
}
}
int main()
{
int n,m;
cin>>n>>m;
int a,b,c,d;
for (int i=1;i<=n;++i)
{
cin>>A[i];
C[i]=A[i]-A[i-1];
modify(i,C[i],n);///改动的地方只是把差分数组当作原来的原数组
}
while (m--)
{
cin>>a;
if (a==1)
{
cin>>b>>c>>d;
modify(b,d,n);///转化一下就是两点之间的修改操作
modify(c+1,-d,n);
}
else if (a==2)
{
cin>>b;
cout<<query(b)<<endl;///从1到b的区间和
}
}
return 0;
}
标签:图片 log pre 证明 include 单点 owb loading 增加
原文地址:https://www.cnblogs.com/qimang-311/p/13380293.html