import
java.util.Arrays;
import
java.util.List;
class
Item {
long
invCount;
int
[] freq =
new
int
[
46
];
public
Item() {
invCount =
0
;
Arrays.fill(freq,
0
);
}
}
class
SegmentTree {
final
Item NEUTRAL =
new
Item();
int
n;
int
[] arr;
Item[] seg;
public
SegmentTree(
int
[] arr) {
this
.n = arr.length;
this
.arr = Arrays.copyOf(arr, n);
this
.seg =
new
Item[
4
* n];
build(
1
,
0
, n -
1
);
}
Item merge(Item left, Item right) {
Item parent =
new
Item();
parent.invCount = left.invCount + right.invCount;
int
[] prev =
new
int
[
46
];
prev[
0
] = right.freq[
0
];
for
(
int
i =
0
; i <
46
; i++) {
parent.freq[i] = left.freq[i] + right.freq[i];
if
(i !=
0
) {
parent.invCount += 1L * left.freq[i] * prev[i -
1
];
prev[i] = prev[i -
1
] + right.freq[i];
}
}
return
parent;
}
Item build(
int
p,
int
l,
int
r) {
if
(l == r) {
seg[p] =
new
Item();
seg[p].invCount =
0
;
seg[p].freq[arr[l]] =
1
;
return
seg[p];
}
int
m = (l + r) /
2
;
return
seg[p] = merge(build(
2
* p, l, m), build(
2
* p +
1
, m +
1
, r));
}
Item build() {
return
build(
1
,
0
, n -
1
);
}
Item set(
int
i,
int
v,
int
p,
int
l,
int
r) {
if
(i < l || i > r)
return
seg[p];
if
(l == r) {
seg[p].freq[arr[i]] =
0
;
seg[p].freq[v] =
1
;
arr[i] = v;
return
seg[p];
}
int
m = (l + r) /
2
;
return
seg[p] = merge(set(i, v,
2
* p, l, m), set(i, v,
2
* p +
1
, m +
1
, r));
}
Item set(
int
i,
int
v) {
return
set(i, v,
1
,
0
, n -
1
);
}
Item query(
int
lx,
int
rx,
int
p,
int
l,
int
r) {
if
(lx > r || l > rx)
return
NEUTRAL;
if
(lx <= l && r <= rx)
return
seg[p];
int
m = (l + r) /
2
;
return
merge(query(lx, rx,
2
* p, l, m), query(lx, rx,
2
* p +
1
, m +
1
, r));
}
long
query(
int
lx,
int
rx) {
return
query(lx, rx,
1
,
0
, n -
1
).invCount;
}
}
public
class
Main {
public
static
void
main(String[] args) {
int
[] arr = {
1
,
2
,
3
,
6
,
5
,
4
};
List<
int
[]> queries = Arrays.asList(
new
int
[] {
1
,
1
,
3
},
new
int
[] {
1
,
2
,
5
},
new
int
[] {
2
,
2
,
8
},
new
int
[] {
1
,
1
,
4
}
);
SegmentTree st =
new
SegmentTree(arr);
for
(
int
[] query : queries) {
int
type = query[
0
];
if
(type ==
1
) {
int
l = query[
1
] -
1
;
int
r = query[
2
] -
1
;
System.out.println(st.query(l, r));
}
else
if
(type ==
2
) {
int
i = query[
1
] -
1
;
st.set(i, query[
2
]);
}
}
}
}