Skip to content

Commit 295f4bb

Browse files
authored
Merge pull request #702 from AlgorithmWithGod/khj20006
[20250820] BOJ / D5 / 수열과 쿼리 39 / 권혁준
2 parents a00d102 + 43159a5 commit 295f4bb

File tree

1 file changed

+207
-0
lines changed

1 file changed

+207
-0
lines changed
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
```java
2+
import java.util.*;
3+
import java.io.*;
4+
5+
class IOController {
6+
BufferedReader br;
7+
BufferedWriter bw;
8+
StringTokenizer st;
9+
10+
public IOController() {
11+
br = new BufferedReader(new InputStreamReader(System.in));
12+
bw = new BufferedWriter(new OutputStreamWriter(System.out));
13+
st = new StringTokenizer("");
14+
}
15+
16+
String nextLine() throws Exception {
17+
String line = br.readLine();
18+
st = new StringTokenizer(line);
19+
return line;
20+
}
21+
22+
String nextToken() throws Exception {
23+
while (!st.hasMoreTokens()) nextLine();
24+
return st.nextToken();
25+
}
26+
27+
int nextInt() throws Exception {
28+
return Integer.parseInt(nextToken());
29+
}
30+
31+
long nextLong() throws Exception {
32+
return Long.parseLong(nextToken());
33+
}
34+
35+
double nextDouble() throws Exception {
36+
return Double.parseDouble(nextToken());
37+
}
38+
39+
void close() throws Exception {
40+
bw.flush();
41+
bw.close();
42+
}
43+
44+
void write(String content) throws Exception {
45+
bw.write(content);
46+
}
47+
48+
}
49+
50+
class Node {
51+
int len, left, right, total;
52+
long lval, rval;
53+
Node(int len, int left, int right, int total, long lval, long rval) {
54+
this.len = len;
55+
this.left = left;
56+
this.right = right;
57+
this.total = total;
58+
this.lval = lval;
59+
this.rval = rval;
60+
}
61+
Node(int len){this.len = len;}
62+
}
63+
64+
class SegTree {
65+
Node[] tree;
66+
long[] arr, lazy;
67+
int size;
68+
SegTree(long[] a) {
69+
size = a.length-1;
70+
arr = new long[size+1];
71+
for(int i=1;i<=size;i++) arr[i] = a[i];
72+
tree = new Node[size*4];
73+
lazy = new long[size*4];
74+
init(1,size,1);
75+
}
76+
77+
Node merge(Node a, Node b) {
78+
if(a.len == 0) return new Node(b.len, b.left, b.right, b.total, b.lval, b.rval);
79+
if(b.len == 0) return new Node(a.len, a.left, a.right, a.total, a.lval, a.rval);
80+
81+
Node c = new Node(a.len + b.len);
82+
c.lval = a.lval;
83+
c.left = a.left;
84+
if(a.left == a.len && a.lval == b.lval) {
85+
c.left = a.left + b.left;
86+
}
87+
88+
c.rval = b.rval;
89+
c.right = b.right;
90+
if(b.right == b.len && b.rval == a.rval) {
91+
c.right = a.right + b.right;
92+
}
93+
94+
c.total = Math.max(a.total, b.total);
95+
if(a.rval == b.lval) c.total = Math.max(c.total, a.right + b.left);
96+
97+
return c;
98+
}
99+
100+
void init(int s, int e, int n) {
101+
if(s == e) {
102+
tree[n] = new Node(1,1,1,1,arr[s],arr[s]);
103+
return;
104+
}
105+
int m = (s+e)>>1;
106+
init(s,m,n*2);
107+
init(m+1,e,n*2+1);
108+
tree[n] = merge(tree[n*2], tree[n*2+1]);
109+
}
110+
111+
void prop(int s, int e, int n) {
112+
if(lazy[n] != 0) {
113+
tree[n].lval += lazy[n];
114+
tree[n].rval += lazy[n];
115+
if(s != e) {
116+
lazy[n*2] += lazy[n];
117+
lazy[n*2+1] += lazy[n];
118+
}
119+
else arr[s] += lazy[n];
120+
lazy[n] = 0;
121+
}
122+
}
123+
124+
void rangeUpdate(int s, int e, int l, int r, long v, int n) {
125+
prop(s,e,n);
126+
if(l>r || l>e || r<s) return;
127+
if(l<=s && e<=r) {
128+
tree[n].lval += v;
129+
tree[n].rval += v;
130+
if(s != e) {
131+
lazy[n*2] += v;
132+
lazy[n*2+1] += v;
133+
}
134+
else arr[s] += v;
135+
return;
136+
}
137+
int m = (s+e)>>1;
138+
rangeUpdate(s,m,l,r,v,n*2);
139+
rangeUpdate(m+1,e,l,r,v,n*2+1);
140+
tree[n] = merge(tree[n*2], tree[n*2+1]);
141+
}
142+
143+
Node find(int s, int e, int l, int r, int n) {
144+
prop(s,e,n);
145+
if(l>r || l>e || r<s) return new Node(0,0,0,0,0,0);
146+
if(l<=s && e<=r) return tree[n];
147+
int m = (s+e)>>1;
148+
return merge(find(s,m,l,r,n*2), find(m+1,e,l,r,n*2+1));
149+
}
150+
}
151+
152+
public class Main {
153+
154+
static IOController io;
155+
156+
//
157+
158+
static int N, M;
159+
static long[] a;
160+
static SegTree seg;
161+
162+
public static void main(String[] args) throws Exception {
163+
164+
io = new IOController();
165+
166+
init();
167+
solve();
168+
169+
io.close();
170+
171+
}
172+
173+
static void init() throws Exception {
174+
175+
N = io.nextInt();
176+
a = new long[N+1];
177+
long[] b = new long[N+1];
178+
for(int i=1;i<=N;i++) {
179+
a[i] = io.nextInt();
180+
b[i] = a[i] - a[i-1];
181+
}
182+
seg = new SegTree(b);
183+
184+
}
185+
186+
static void solve() throws Exception {
187+
188+
for(M = io.nextInt();M-->0;) {
189+
int op = io.nextInt();
190+
int i = io.nextInt();
191+
int j = io.nextInt();
192+
if(op == 1) {
193+
long x = io.nextLong();
194+
long y = io.nextLong();
195+
seg.rangeUpdate(1,N,i,i,x,1);
196+
seg.rangeUpdate(1,N,i+1,j,y,1);
197+
if(j != N) seg.rangeUpdate(1,N,j+1,j+1,-(x+y*((long)j-i)),1);
198+
}
199+
else {
200+
io.write((seg.find(1,N,i+1,j,1).total+1) + "\n");
201+
}
202+
}
203+
204+
}
205+
206+
}
207+
```

0 commit comments

Comments
 (0)