如題,已知乙個數列,你需要進行下面三種操作:
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 381 5 4 2 3
2 1 4 1
3 2 5
1 2 4 2
2 3 5 5
3 1 4
輸出樣例#1:複製
172
時空限制:1000ms,128m
資料規模:
對於30%的資料:n<=8,m<=10
對於70%的資料:n<=1000,m<=10000
對於100%的資料:n<=100000,m<=100000
1//2023年2月22日21:51:08
2 #include 3 #include 4 #include 5 #include 6
using
namespace
std;78
intn, m, mo;
9int a[410000], b[410000], sum[410000], size[410000
];10
11void change(int
k1)14
15void buildtree(int k1, int l, int
r)20
int mid = (l+r) >> 1
;21 buildtree(k1*2
, l, mid);
22 buildtree(k1*2+1, mid+1
, r);
23change(k1); 24}
2526
void add(int k1, int
x)30
31void chen(int k1, int
x)36
37void pushdown(int
k1)42
if(a[k1])47}
4849
void add(int k1, int l, int r, int l, int r, int
x)55
int mid = (l+r) >> 1;56
pushdown(k1);
57 add(k1*2
, l, mid, l, r, x);
58 add(k1*2+1, mid+1
, r, l, r, x);
59change(k1);60}
6162
void chen(int k1, int l, int r, int l, int r, int
x)67
int mid = l+r >> 1;68
pushdown(k1);
69 chen(k1*2
, l, mid, l, r, x);
70 chen(k1*2+1, mid+1
, r, l, r, x);
71change(k1);72}
7374
int find(int k1, int l, int r, int l, int
r)81
82int
main()else
if(k1 == 1
)else printf("
%d\n
", find(1, 1
, n, k2, k3));93}
9495
return0;
96 }
Luogu P3373 模板 線段樹 2
如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 include define mem x,v memset x,v,sizeof x define go i,a,b for int i a i b i define og...
P3373 線段樹模板
如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 輸入格式 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包...
luogu3373 模板 線段樹 2
題面 已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 題解區間修改 區間查詢。維護兩個lazytag include include using namespace std const int maxn 100010 type...