P3373 模板 線段樹 2

2021-09-28 15:44:18 字數 2425 閱讀 9159

題目描述

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

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的結果。

輸入輸出樣例

輸入 #1

5 5 38

1 5 4 2 3

2 1 4 1

3 2 5

1 2 4 2

2 3 5 5

3 1 4

輸出 #1172

說明/提示

時空限制:1000ms,128m

資料規模:

對於30%的資料:n<=8,m<=10

對於70%的資料:n<=1000,m<=10000

對於100%的資料:n<=100000,m<=100000

(資料已經過加強_)

樣例說明:

故輸出應為17、2(40 mod 38=2)

#include

using

namespace std;

typedef

long

long ll;

const

int n=

100010

;int n,m;ll p;

ll a[n]

;struct node

t[n<<2]

;voidup(

int rt)

void

pushdown

(int rt,

int l,

int r)

void

build

(int rt,

int l,

int r)

int mid=

(l+r)

>>1;

build

(rt<<

1,l,mid)

;build

(rt<<1|

1,mid+

1,r);up

(rt);}

void

update

(int rt,

int l,

int r,

int l,

int r,ll k)

pushdown

(rt,l,r)

;int mid=

(l+r)

>>1;

if(l<=mid)

update

(rt<<

1,l,mid,l,r,k);if

(r>mid)

update

(rt<<1|

1,mid+

1,r,l,r,k);up

(rt);}

void

update1

(int rt,

int l,

int r,

int l,

int r,ll k)

pushdown

(rt,l,r)

;int mid=

(l+r)

>>1;

if(l<=mid)

update1

(rt<<

1,l,mid,l,r,k);if

(r>mid)

update1

(rt<<1|

1,mid+

1,r,l,r,k);up

(rt);}

ll query

(int rt,

int l,

int r,

int l,

int r)

pushdown

(rt,l,r)

;int mid=

(l+r)

>>

1;ll s=0;

if(l<= mid) s+

=query

(rt<<

1,l,mid,l,r);if

(r>mid) s+

=query

(rt<<1|

1,mid+

1,r,l,r)

;return s%p;

}int

main()

if(op==2)

if(op==3)

}}

P3373 模板 線段樹2

如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 include include using namespace std const int maxn 100005 int n,m,p long long arr maxn...

P3373 模板 線段樹 2

ac 這裡的延遲標記要開兩個,分別記錄加法的值和乘法的值,但是乘法和加法的優先順序不一樣,不規定他們的順序的話會有錯誤,所以可以規定乘法優先,即規定好該結點的值等於該節點的值 父節點的乘法延遲標記的值 父節點加法延遲標記的值 區間長度,即,sum num 2 sum num 2 add num wc...

P3373 模板 線段樹 2

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