線段樹模版

2021-08-15 22:06:44 字數 1738 閱讀 3788

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

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

輸出樣例#1:

複製

17

2

時空限制:1000ms,128m

資料規模:

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

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

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

(資料已經過加強^_^)

樣例說明:

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

#includeusing namespace std;

#define maxn 100000+100000

#define ll long long

int mod;

ll tre[maxn<<2];

int a[maxn];

ll add[maxn<<2];

ll sub[maxn<<2];

void push(int in,int rt)

void build(int in,int l,int r)

int mid=(l+r)/2;

build(in*2,l,mid);

build(in*2+1,mid+1,r);

tre[in]=(tre[in]+tre[in*2]+tre[in*2+1])%mod;

}void updata(int in,int l,int r, int va,int x,int y,int i)

if(i==2)

return ;

}int mid=(x+y)/2;

if(l>mid)

else if(r<=mid)

else

tre[in]=(tre[in*2]+tre[in*2+1])%mod;

tre[in]%=mod;

}ll query(int in,int l,int r,int x,int y)

int mid=(x+y)/2;

if(l>mid)

else if(r<=mid)

else

}int main()

build(1,1,n);

while(m--)

else

}return 0;

}

線段樹模版

題目 給定乙個整數陣列 nums,求出陣列從索引 i 到 j i j 範圍內元素的總和,包含 i,j 兩點。update i,val 函式可以通過將下標為 i 的數值更新為 val,從而對數列進行修改。示例 given nums 1,3,5 sumrange 0,2 9update 1,2 sumr...

線段樹 區間更新 模版

include include cstdio include string.h using namespace std const int n 100005 struct node tree n 4 int n,m int a n void init 將下面更新的值返回上一層 void pushup...

線段樹模版 codevs1081線段樹練習2

題目描述 description 給你n個數,有兩種操作 1 給區間 a,b 的所有數都增加x 2 詢問第i個數是什麼?輸入描述 input description 第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,表示操作的個數.接下來q行每行若干個整數。如果第乙個數是1,後接3個正整...