听 取 R E 声 一 片
查看原帖
听 取 R E 声 一 片
264463
添哥楼主2020/9/4 18:20

我用的是线段树,#2#9#10都RE,球debug,或者hack也好

#include<iostream>
using namespace std;
int n,m;
int a[10005],tree[40005],b[10005];
int build(int k,int l,int r)
{
    if(l==r)
    {
    	b[l]=k;
        tree[k]=a[l];
        return tree[k];
    }
    int mid=(l+r)/2;
    tree[k]=build(k*2,l,mid)+build(k*2+1,mid+1,r);
    return tree[k];
}
void change(int i,int n)
{
    tree[i]+=n;
    if(i==1)
    {
        return;
    }
    if(i%2==1)
    {
        change((i-1)/2,n);
    }
    else
    {
        change(i/2,n);
    }
    return;
}
int find(int k,int x,int y,int l,int r)
{
    if(l<=x&&y<=r)
    {
        return tree[k];
    }
    if(l>y||r<x)
    {
        return 0;
    }
    int mid=(x+y)/2;
    int ans=0;
    ans+=find(k*2,x,mid,l,r);
    ans+=find(k*2+1,mid+1,y,l,r);
    return ans;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    build(1,1,n);
    while(m--)
    {
        int t,x,y;
        cin>>t>>x>>y;
        if(t==1)
        {
            change(b[x],y);
        }
        else
        {
            cout<<find(1,1,n,x,y)<<endl;
        }
    }
    return 0;
}
2020/9/4 18:20
加载中...