0%

jls线段树模板

题目: [AHOI2009] 维护序列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 110000;
int A[N<<2], sum[N<<2];
int B[N<<2], size[N<<2];

int n, m, mo;
void change(int k1){
sum[k1] = (sum[k1*2]+sum[k1*2+1]) % mo;
}

void add(int k1, int k2){
A[k1] = (A[k1]+k2) % mo;
sum[k1] = (sum[k1]+1ll*size[k1]*k2)%mo;
}

void buildtree(int k1, int l, int r){
size[k1] = r-l+1; B[k1] = 1;
if(l == r){
scanf("%d", &sum[k1]);return;
}
int mid = l+r >> 1;
buildtree(k1*2, l, mid);
buildtree(k1*2+1, mid+1, r);
change(k1);
}
void chen(int k1, int k2){
A[k1] = 1ll*A[k1]*k2%mo;
B[k1] = 1ll*B[k1]*k2%mo;
sum[k1] = 1ll*sum[k1]*k2%mo;
}

void pushdown(int k1){
if(B[k1] != 1){
chen(k1*2, B[k1]);
chen(k1*2+1, B[k1]);
B[k1] = 1;
}
if(A[k1]){
add(k1*2, A[k1]);
add(k1*2+1, A[k1]);
A[k1] = 0;
}

}
void add(int k1, int L, int R, int l, int r, int val){
if(L>r || R < l) return;
if(L>=l && R<=r) {
add(k1, val); return;
}
int mid = L+R >> 1;
pushdown(k1);
add(k1*2, L, mid, l, r, val);
add(k1*2+1, mid+1, R, l, r, val);
change(k1);
}

int find(int k1, int L, int R, int l, int r){
if(L>r || R < l) return 0;
if(L>=l && R<=r) return sum[k1];
int mid = L+R>>1; pushdown(k1);
return (find(k1*2, L, mid, l, r) + find(k1*2+1, mid+1, R, l, r))%mo;
}

void chen(int k1, int L, int R, int l, int r, int val){
if(L > r || R < l) return;
if(L>=l && R <= r){
chen(k1, val); return;
}
int mid = L+R >> 1;
pushdown(k1);
chen(k1*2, L, mid, l, r, val);
chen(k1*2+1, mid+1, R, l, r, val);
change(k1);
}

int main(){
cin >> n >> mo;
buildtree(1, 1, n);
int m; cin >> m;
while(m--){
int k1, l, r;
scanf("%d%d%d", &k1, &l, &r);
if(k1 == 2){
int k4;
scanf("%d", &k4);
add(1, 1, n, l, r, k4);
}else if(k1 == 1){
int k4;
scanf("%d", &k4);
chen(1, 1, n, l, r, k4);
}else{
printf("%d\n", find(1, 1, n, l, r));
}
}

return 0;
}

求大佬赏个饭