线段树

单点查询 区间修改

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
int tr[N<<2],a[N];
int lowbit(int x)
{
    return x&-x;
}
void update(int u,int v)
{
    for(int i=u;i<=n;i+=lowbit(i))
    tr[i]+=v;
}
int query(int u)
{
    int sum=0;
    for(int i=u;i;i-=lowbit(i))
    sum+=tr[i];
    return sum;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        update(i,a[i]-a[i-1]);
    }
    while(m--)
    {
        char op[2];
        cin>>op;
        if(op[0]=='Q')
        {
            int u;
            cin>>u;
            cout<<query(u)<<endl;
        }
        else
        {
            int l,r,x;
            cin>>l>>r>>x;
            update(l,x),update(r+1,-x);
        }
    }
    return 0;
}

posted @ 2022-07-31 19:39  玉子安  阅读(17)  评论(0)    收藏  举报