首页 > 代码库 > AOJ DSL_2_E Range Add Query (RAQ)

AOJ DSL_2_E Range Add Query (RAQ)

Range Add Query

数列 A = {a1,a2,...,an} に対し、次の2つの操作を行うプログラムを作成せよ。

  • add(s,t,x): as,as+1,...,at にxを加算する。
  • get(i): aiの値を出力する。

ただし、ai (i=1,2,...,n)は、0 で初期化されているものとする。

入力

n qquery1query2:queryq

1行目にAの要素数n, クエリの数qが与えられる。続くq行に i 番目のクエリ queryi が与えられる。queryi は以下のいずれかの形式で与えられる。

0 s t x

または

1 i

各クエリの最初の数字は、クエリの種類を示し、‘0‘がadd(s,t,x)、‘1‘がget(i)を表す。

出力

getクエリについて、値を1行に出力せよ。

制約

  • 1≤n≤100000
  • 1≤q≤100000
  • 1≤stn
  • 1≤in
  • 0≤x≤1000

入力例 1

3 50 1 2 10 2 3 20 3 3 31 21 3

出力例 1

35

 

入力例 2

4 31 20 1 4 11 2

出力例 2

01

 
 

区间加 单点查

树状数组+差分 或 线段树

缩常数,继续打榜

 

 1 #include <cstdio> 2 #include <cstdlib> 3  4 #define siz 10000000 5  6 char buf[siz], *bit = buf; 7  8 inline int nextInt(void) { 9     register int ret = 0;10     register int neg = false;11 12     for (; *bit < 0; ++bit)13         if (*bit == -)neg ^= true;14 15     for (; *bit >= 0; ++bit)16         ret = ret * 10 + *bit - 0;17 18     return neg ? -ret : ret;19 }20 21 int n, m;22 23 int pre[100005];24 25 inline int ask(int p) {26     int ret = 0;27     for (; p; p -= p&-p)28         ret += pre[p];29     return ret;30 }31 32 inline void add(int p, int k) {33     for (; p <= n; p += p&-p)34         pre[p] += k;35 }36 37 signed main(void) {38     fread(buf, 1, siz, stdin);39 40     n = nextInt();41     m = nextInt();42 43     for (int i = 1; i <= m; ++i) {44         int c = nextInt();45         if (c)    // get(i)46             printf("%d\n", ask(nextInt()));47         else    // add(s, t, x)48         {49             int x = nextInt();50             int y = nextInt();51             int k = nextInt();52             add(x, k); add(y + 1, -k);53         }54     }55 56     //system("pause");57 }

 

@Author: YouSiki

AOJ DSL_2_E Range Add Query (RAQ)