CDOJ 838 母仪天下 树状数组 (2014数据结构专题

母仪天下

Time Limit: 1 Sec  Memory Limit: 162 MB

题目连接

http://acm.uestc.edu.cn/#/problem/show/838

Description

富庶的建业城中,有一条格格不入的长街,名曰跳蚤街,被战争所致的孤儿,聚集于此。全国的经济都在为战争服务之时,也无人顾得了这里了。

除了两位夫人。

大乔小乔每天都会带着一些食物来到跳蚤街,分给某一位孩子。为了避免分配不均,她们时常会询问一个区域内食物的总量,然后进行调整以保证每个孩子都有足够的食物。

Input

第一行两个整数n,m,表示跳蚤街住着n户孩子,大乔小乔一共分发或询问了m次。

第二行n个整数,第i个数ai表示第i户孩子已有ai的食物。

接下来m行,每行开始先读入一个整数si,指明这是一次询问还是一次分发。

si=0,表明这是一次询问,然后读入两个整数li,ri,表示询问[li,ri]区间中的孩子们一共有多少食物。

si=1,表明这是一次分发,然后读入两个整数xi,wi,表示对第xi户孩子分发了wi的食物。

1≤n,m≤100000,0≤ai≤100000,1≤xi≤n,0≤wi≤10000,1≤li≤ri≤n

1n,m100000,0ai100000,1xin,0wi10000,1lirin

Output

有多少询问就输出多少行,每行输出一个整数,作为对该询问的回答。

Sample Input

5 4

1 2 3 4 5

1 2 3

0 2 4

1 4 1

0 1 5

Sample Output

12 19

HINT

题解:

啊,裸的线段树或者树状数组,乱搞就好啦

加了输入输出挂,结果和scanf的速度一样……

代码:

 

#include<stdio.h>

#include<iostream>

#include<math.h>

#include<map>

#include<stack>

using namespace std;

#define maxn 100005

inline long long read()

{

    int x=0,f=1;char ch=getchar();

    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}

    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}

    return x*f;

}

int buf[10];

inline void write(int i) {

  int p = 0;if(i == 0) p++;

  else while(i) {buf[p++] = i % 10;i /= 10;}

  for(int j = p-1; j >=0; j--) putchar('0' + buf[j]);

  printf("\n");

}

int lowbit(int x)

{

    return x&(-x);

}

int n,m;

int a[maxn];

void add(int x,int y)

{

    while(x<=n)

    {

        a[x]+=y;

        x+=lowbit(x);

    }

}

int sum(int x)

{

    int s=0;

    while(x>0)

    {

        s+=a[x];

        x-=lowbit(x);

    }

    return s;

}



int main()

{

    n=read(),m=read();

    for(int i=1;i<=n;i++)

    {

        int x=read();

        add(i,x);

    }

    for(int i=0;i<m;i++)

    {

        int x=read();

        if(x==0)

        {

            int c=read(),d=read();

            write(sum(d)-sum(c-1));

        }

        else

        {

            int c=read(),d=read();

            add(c,d);

        }

    }

    return 0;

}

 

你可能感兴趣的:(数据结构)