求助大佬!!!#1#3#4WA!
查看原帖
求助大佬!!!#1#3#4WA!
544452
YANGKAIHAN1楼主2021/12/24 20:43
代码如下
#include<cstdio>
#include<cctype>
#include<vector>
#include<iostream>
using namespace std;
typedef pair<int,int> pii;
typedef pair<pii,int> ppi;
vector<ppi>tree;
vector<int>a;
#define l(x) tree[x].first.first
#define r(x) tree[x].first.second
#define sum(x) tree[x].second
int scan(){
    register int x=0,f=1,ch;
    while(!isdigit(ch=getchar()))
        if(ch=='-')
            f=-f;
    x=ch-48;
    while(isdigit(ch=getchar()))
        x=x*10+ch-48;
    return x*f;
}
void build(int p,int l,int r){
    l(p)=l,r(p)=r;
    if(l==r){
        sum(p)=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(p*2 , l , mid);
    build(p*2+1,mid+1,r);
    sum(p)=sum(p*2)+sum(p*2+1);
    return;
}
void change(int p,int x,int v){
    if(l(p)==r(p)){
        sum(p)+=v;
        return;
    }
    int mid=(l(p)+r(p))/2;
    if(x<=mid)
        change(p*2,x,v);
    else
        change(p*2+1,x,v);
    sum(p)=sum(p*2)+sum(p*2+1);
    return;
}
int ask(int p,int l,int r){
    if(l<=l(p)&&r>=r(p))
        return sum(p);
    int mid=(l(p)+r(p))/2,val=0;
    if(l<=mid)
        val+=ask(p*2,l,r);
    if(r>mid)
        val+=ask(p*2+1,l,r);
    return val;
}
int main(){
    int n=scan(),m=scan();
    tree.resize(n*4+1);
    a.push_back(0);
    for(int i=1;i<=n;++i)
        a.push_back(scan());
    build(1,1,n);
    for(int i=0,x,y;i<n;++i)
        switch(scan()){
            case 1:x=scan();y=scan();change(1,x,y);break;
            case 2:x=scan();y=scan();printf("%d\n",ask(1,x,y));break;
        }
    return 0;
}

2021/12/24 20:43
加载中...