```cpp
#include<iostream>
#include<cstdio>
using namespace std;
long long n,m;
long long c[500000+5],a[500000+5];
long long o2(int x)
{
return x&(-x);
}
void add(long long i,long long n,long long num)
{
while(i<=n)
{
c[i]+=num;
i+=o2(i);
}
}
long long find(long long i)
{
long long ans=0;
while(i>0)
{
ans+=c[i];
i-=o2(i);
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
add(i,n,a[i]-a[i-1]);
}
for(int i=1;i<=m;i++)
{
long long flag,x,y,k;
cin>>flag;
if(flag==1)
{
cin>>x>>y>>k;
add(x,y+1,k);
}
else
{
cin>>x;
cout<<find(x)<<endl;
}
}
return 0;
}
```
by ryarrn @ 2018-11-07 22:19:19
和题解的差距就是我的区间修改从输入的区间遍历,题解是从第一个数到n加上值,再从第二个数+1减去值,不知道自己的做法为什么只得了30分。求大佬指教
```cpp
void add(long long i,long long n,long long num)
{
while(i<=n)
{
c[i]+=num;
i+=o2(i);
}
}
```
by ryarrn @ 2018-11-07 22:22:04
这道题要用差分呀
by qseer @ 2018-11-07 22:53:32
线段树万岁!!!
~~谁有UKE代码?(最好带上题号)**学术版讨论被删除了QWQ**~~
by 持之以珩 @ 2019-01-27 22:54:50