using
System;
using
System.Collections.Generic;
class
SegmentTree
{
const
int
MAX = 100000;
int
[] tree =
new
int
[4 * MAX];
int
[] lazy =
new
int
[4 * MAX];
void
Build(
int
node,
int
start,
int
end)
{
if
(start == end)
{
tree[node] = 0;
}
else
{
int
mid = (start + end) / 2;
Build(2 * node, start, mid);
Build(2 * node + 1, mid + 1, end);
tree[node] = Math.Min(tree[2 * node], tree[2 * node + 1]);
}
}
void
Update(
int
node,
int
start,
int
end,
int
l,
int
r,
int
val)
{
if
(lazy[node] != 0)
{
tree[node] += 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] += val;
if
(start != end)
{
lazy[node * 2] += val;
lazy[node * 2 + 1] += val;
}
return
;
}
int
mid = (start + end) / 2;
Update(node * 2, start, mid, l, r, val);
Update(node * 2 + 1, mid + 1, end, l, r, val);
tree[node] = Math.Min(tree[node * 2], tree[node * 2 + 1]);
}
int
Query(
int
node,
int
start,
int
end,
int
l,
int
r)
{
if
(start > end || start > r || end < l)
return
int
.MaxValue;
if
(lazy[node] != 0)
{
tree[node] += 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 = Query(node * 2, start, mid, l, r);
int
p2 = Query(node * 2 + 1, mid + 1, end, l, r);
return
Math.Min(p1, p2);
}
static
void
Main()
{
int
n = 5;
var
segmentTree =
new
SegmentTree();
segmentTree.Build(1, 0, n - 1);
var
queries =
new
List<
int
[]>()
{
new
int
[] {1, 0, 3, 3},
new
int
[] {2, 1, 2},
new
int
[] {1, 1, 4, 4},
new
int
[] {2, 1, 3},
new
int
[] {2, 1, 4},
new
int
[] {2, 3, 5}
};
foreach
(
var
q
in
queries)
{
int
type = q[0];
if
(type == 1)
{
int
l = q[1], r = q[2], x = q[3];
segmentTree.Update(1, 0, n - 1, l, r - 1, x);
}
else
if
(type == 2)
{
int
l = q[1], r = q[2];
int
ans = segmentTree.Query(1, 0, n - 1, l, r - 1);
Console.WriteLine(ans);
}
}
}
}