乙個簡單的整數問題2

2021-10-03 05:10:26 字數 2874 閱讀 5481

給定乙個長度為n的數列a,以及m條指令,每條指令可能是以下兩種之一:

1、「c l r d」,表示把 a[l],a[l+1],…,a[r] 都加上 d。

2、「q l r」,表示詢問 數列中第 l~r 個數的和。

對於每個詢問,輸出乙個整數表示答案。

輸入格式

第一行兩個整數n,m。

第二行n個整數a[i]。

接下來m行表示m條指令,每條指令的格式如題目描述所示。

輸出格式

對於每個詢問,輸出乙個整數表示答案。

每個答案佔一行。

資料範圍

1≤n,m≤105,

|d|≤10000,

|a[i]|≤1000000000

輸入樣例:105

1234

5678

910q 44

q 110

q 24

c 36

3q 2

4輸出樣例:455

915

線段樹

#include

#define ll long long

using

namespace std;

const

int n =

1e5+10;

struct t t[n *4]

;int a[n]

, n, m;

inline

void

build

(int p,

int l,

int r)

int mid =

(l + r)

>>1;

build

(p <<

1, l, mid)

;build

(p <<1|

1, mid +

1, r);s

(p)=

s(p <<1)

+s(p <<1|

1);}

inline

void

spread

(int p)

}void

change

(int p,

int l,

int r,

int d)

spread

(p);

int mid =(l

(p)+

r(p)

)>>1;

if(l <= mid)

change

(p <<

1, l, r, d);if

(r > mid)

change

(p <<1|

1, l, r, d);s

(p)=

s(p <<1)

+s(p <<1|

1);}

ll ask

(int p,

int l,

int r)

intmain()

else

printf

("%lld\n"

,ask(1

, l, r));

}return0;

}

樹狀陣列

#include

#define ll long long

#define lowbit(x) ((x)&(-(x)))

using

namespace std;

const

int n =

1e5+10;

ll c[2]

[n], a[n]

;int n, m;

inline ll ask

(int k,

int x)

inline

void

add(

int x,

int d)

intmain()

else

}return0;

}

分塊

#include

#define ll long long

using

namespace std;

const

int n =

1e5+10;

ll a[n]

, sum[n]

, add[n]

;int l[n]

, r[n]

, pos[n]

;int n, m, t;

inline

void

build()

if(r[t]

< n)t++

, l[t]

= r[t -1]

+1, r[t]

= n;

for(

int i =

1; i <= t; i++

)for

(int j = l[i]

; j <= r[i]

; j++

) pos[j]

= i, sum[i]

+= a[j];}

inline

void

change

(int l,

int r, ll d)

else

}inline ll ask

(int l,

int r)

else

return ans;

}int

main()

else

printf

("%lld\n"

,ask

(l, r));

}return0;

}

乙個簡單的整數問題

給定長度為n的數列a,然後輸入m行操作指令。第一類指令形如 c l r d 表示把數列中第l r個數都加d。第二類指令形如 q x 表示詢問數列中第x個數的值。對於每個詢問,輸出乙個整數表示答案。輸入格式 第一行包含兩個整數n和m。第二行包含n個整數a i 接下來m行表示m條指令,每條指令的格式如題...

乙個簡單的整數問題

給定長度為n的數列a,然後輸入m行操作指令。第一類指令形如 c l r d 表示把數列中第l r個數都加d。第二類指令形如 q x 表示詢問數列中第x個數的值。對於每個詢問,輸出乙個整數表示答案。輸入格式 第一行包含兩個整數n和m。第二行包含n個整數a i 接下來m行表示m條指令,每條指令的格式如題...

乙個簡單的整數問題

題目描述給定長度為n的數列a,然後輸入m行操作指令。第一類指令形如 c l r d 表示把數列中第l r個數都加d。第二類指令形如 q x 表示詢問數列中第x個數的值。對於每個詢問,輸出乙個整數表示答案。輸入格式 第一行包含兩個整數n和m。第二行包含n個整數a i 接下來m行表示m條指令,每條指令的...