模板 線段樹2

2022-02-13 23:23:35 字數 1917 閱讀 1525

(模板)線段樹2

如題,已知乙個數列,你需要進行下面三種操作:

1.將某區間每乙個數乘上x

2.將某區間每乙個數加上x

3.求出某區間每乙個數的和

第一行包含三個整數n、m、p,分別表示該數列數字的個數、操作的總個數和模數。

第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。

接下來m行每行包含3或4個整數,表示乙個操作,具體如下:

操作1: 格式:1 x y k 含義:將區間[x,y]內每個數乘上k

操作2: 格式:2 x y k 含義:將區間[x,y]內每個數加上k

操作3: 格式:3 x y 含義:輸出區間[x,y]內每個數的和對p取模所得的結果

輸出格式:

輸出包含若干行整數,即為所有操作3的結果。

n<=100000,m<=100000

**:

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;

67 inline int

read()814

#define res register int

15 typedef long

long

ll;

16const

int n=100000+5;17

struct

segtreetr[n<<2

];26

inta[n],n,m,s;

2728 inline void push_up(int

p)29

3233 inline void build(int p,int l,int

r)34

38int mid=(l+r)>>1

;39 build(p<<1,l,mid); build(p<<1|1,mid+1

,r);

40push_up(p);41}

4243 inline void push_down(int

p)4455}

5657 inline void change1(int p,int l,int r,int

d)58

65push_down(p);

66int mid=(l(p)+r(p))>>1;67

if(l<=mid) change1(p<<1

,l,r,d);

68if(r>mid) change1(p<<1|1

,l,r,d);

69push_up(p);70}

7172 inline void change2(int p,int l,int r,int

d)73

78push_down(p);

79int mid=(l(p)+r(p))>>1;80

if(l<=mid) change2(p<<1

,l,r,d);

81if(r>mid) change2(p<<1|1

,l,r,d);

82push_up(p);83}

8485 ll ask(int p,int l,int

r)86

94int

main()

95106

else

if(op==2

)107

110else

if(op==3

)111 printf("

%lld\n

",ask(1

,x,y));

112}

113return0;

114 }

view code

模板 線段樹 2

題目描述 如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 輸入格式 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來...

模板 線段樹 2

如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.將某區間每乙個數乘上x 3.求出某區間每乙個數的和 輸入格式 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包...

模板 維護序列2(線段樹)

取模取掛可真是令人質壁分離。兩兩乘積和可以直接用兩個區間的區間和相乘再加上兩個區間各自的乘積和得到,而相鄰乘積和直接兩段相加再加上左區間右端點與右區間左端點乘積就好了。注意 mod mod includeusing namespace std typedef long long ll const l...