您的位置:首页 > 产品设计 > UI/UE

AOJ DSL_2_E Range Add Query (RAQ)

2016-12-17 14:43 197 查看

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 q
query1
query2
:
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≤s≤t≤n

1≤i≤n

0≤x≤1000

入力例 1

3 5
0 1 2 1
0 2 3 2
0 3 3 3
1 2
1 3

出力例 1

3
5


入力例 2

4 3
1 2
0 1 4 1
1 2

出力例 2

0
1


区间加 单点查

树状数组+差分 或 线段树

缩常数,继续打榜

#include <cstdio>
#include <cstdlib>

#define siz 10000000

char buf[siz], *bit = buf;

inline int nextInt(void) {
register int ret = 0;
register int neg = false;

for (; *bit < '0'; ++bit)
if (*bit == '-')neg ^= true;

for (; *bit >= '0'; ++bit)
ret = ret * 10 + *bit - '0';

return neg ? -ret : ret;
}

int n, m;

int pre[100005];

inline int ask(int p) {
int ret = 0;
for (; p; p -= p&-p)
ret += pre[p];
return ret;
}

inline void add(int p, int k) {
for (; p <= n; p += p&-p)
pre[p] += k;
}

signed main(void) {
fread(buf, 1, siz, stdin);

n = nextInt();
m = nextInt();

for (int i = 1; i <= m; ++i) {
int c = nextInt();
if (c)    // get(i)
printf("%d\n", ask(nextInt()));
else    // add(s, t, x)
{
int x = nextInt();
int y = nextInt();
int k = nextInt();
add(x, k); add(y + 1, -k);
}
}

//system("pause");
}


@Author: YouSiki
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: