838CDOJ 母仪天下

来源:互联网 发布:陆小凤的身世之谜 知乎 编辑:程序博客网 时间:2024/04/28 09:52

一个简单的线段树,直接套模板就OK。

#include<stdio.h>#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;struct Tree{    int left,right;    int sum;}tree[400009];int s[200001];void build(int id, int l, int r){    tree[id].left=l; tree[id].right=r;    if(l==r)    {        tree[id].sum=s[l];        return ;    }    int mid=(l+r)/2;    build(id*2,l,mid);    build(id*2+1,mid+1,r);    tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;}void update(int id,int pos,int val){    if(tree[id].left==tree[id].right)    {        tree[id].sum+=val;        return;    }    if(tree[id*2].right>=pos)        update(id*2,pos,val);    else        update(id*2+1,pos,val);    tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;}int query(int id,int l, int r){    if(tree[id].left==l&&tree[id].right==r)    return tree[id].sum;    else    {        int mid=(tree[id].left+tree[id].right)/2;        if(r<=mid)        return query(id*2,l,r);        else if(l>mid)        return query(id*2+1,l,r);        else        return query(id*2,l,mid)+query(id*2+1,mid+1,r);    }}int main(){    int n,m,i,a,b,c;    while(scanf("%d%d",&n,&m)==2){    for(i=1;i<=n;i++)    scanf("%d",&s[i]);    build(1,1,n);    while(m--)    {        scanf("%d%d%d",&a,&b,&c);        if(a==1)        {            update(1,b,c);        }        else        {            printf("%d\n",query(1,b,c));        }    }    }    return 0;}


0 0
原创粉丝点击