import
java.util.Arrays;
class
Main {
static
final
int
MAX =
100000
;
static
int
[] tree =
new
int
[
4
* MAX];
static
int
[] lazy =
new
int
[
4
* MAX];
static
void
updateRange(
int
node,
int
start,
int
end,
int
l,
int
r,
int
val) {
if
(lazy[node] !=
0
) {
tree[node] = (end - start +
1
) * lazy[node];
if
(start != end) {
lazy[node *
2
] = lazy[node];
lazy[node *
2
+
1
] = lazy[node];
}
lazy[node] =
0
;
}
if
(start > end || start > r || end < l)
return
;
if
(start >= l && end <= r) {
tree[node] = (end - start +
1
) * val;
if
(start != end) {
lazy[node *
2
] = val;
lazy[node *
2
+
1
] = val;
}
return
;
}
int
mid = (start + end) /
2
;
updateRange(node *
2
, start, mid, l, r, val);
updateRange(node *
2
+
1
, mid +
1
, end, l, r, val);
tree[node] = tree[node *
2
] + tree[node *
2
+
1
];
}
static
int
queryRange(
int
node,
int
start,
int
end,
int
l,
int
r) {
if
(start > end || start > r || end < l)
return
0
;
if
(lazy[node] !=
0
) {
tree[node] = (end - start +
1
) * lazy[node];
if
(start != end) {
lazy[node *
2
] = lazy[node];
lazy[node *
2
+
1
] = lazy[node];
}
lazy[node] =
0
;
}
if
(start >= l && end <= r)
return
tree[node];
int
mid = (start + end) /
2
;
int
p1 = queryRange(node *
2
, start, mid, l, r);
int
p2 = queryRange(node *
2
+
1
, mid +
1
, end, l, r);
return
(p1 + p2);
}
public
static
void
main(String[] args) {
int
n =
5
, q =
3
;
int
[][] queries = { {
1
,
0
,
3
,
5
}, {
2
,
1
,
4
}, {
1
,
2
,
4
,
10
} };
for
(
int
i =
0
; i < q; i++) {
int
type = queries[i][
0
];
if
(type ==
1
) {
int
l = queries[i][
1
], r = queries[i][
2
], v = queries[i][
3
];
updateRange(
1
,
0
, n -
1
, l, r -
1
, v);
}
else
{
int
l = queries[i][
1
], r = queries[i][
2
];
System.out.println(queryRange(
1
,
0
, n -
1
, l, r -
1
));
}
}
}
}