import
java.util.*;
class
GFG {
static
int
getMid(
int
s,
int
e) {
return
s + (e - s) /
2
;
}
static
int
getXorUtil(
int
[] st,
int
ss,
int
se,
int
qs,
int
qe,
int
si)
{
if
(qs <= ss && qe >= se)
return
st[si];
if
(se < qs || ss > qe)
return
0
;
int
mid = getMid(ss, se);
return
getXorUtil(st, ss, mid, qs, qe,
2
* si +
1
) ^
getXorUtil(st, mid +
1
, se, qs, qe,
2
* si +
2
);
}
static
void
updateValueUtil(
int
[] st,
int
ss,
int
se,
int
i,
int
prev_val,
int
new_val,
int
si)
{
if
(i < ss || i > se)
return
;
st[si] = (st[si] ^ prev_val) ^ new_val;
if
(se != ss) {
int
mid = getMid(ss, se);
updateValueUtil(st, ss, mid, i, prev_val,
new_val,
2
* si +
1
);
updateValueUtil(st, mid +
1
, se, i, prev_val,
new_val,
2
* si +
2
);
}
}
static
void
updateValue(
int
arr[],
int
[] st,
int
n,
int
i,
int
new_val)
{
if
(i <
0
|| i > n -
1
) {
System.out.printf(
"Invalid Input\n"
);
return
;
}
int
temp = arr[i];
arr[i] = new_val;
updateValueUtil(st,
0
, n -
1
, i, temp, new_val,
0
);
}
static
int
getXor(
int
[] st,
int
n,
int
qs,
int
qe)
{
if
(qs <
0
|| qe > n -
1
|| qs > qe)
{
System.out.printf(
"Invalid Input\n"
);
return
0
;
}
return
getXorUtil(st,
0
, n -
1
, qs, qe,
0
);
}
static
int
constructSTUtil(
int
arr[],
int
ss,
int
se,
int
[] st,
int
si)
{
if
(ss == se)
{
st[si] = arr[ss];
return
arr[ss];
}
int
mid = getMid(ss, se);
st[si] = constructSTUtil(arr, ss, mid, st, si *
2
+
1
) ^
constructSTUtil(arr, mid +
1
, se, st, si *
2
+
2
);
return
st[si];
}
static
int
[] constructST(
int
arr[],
int
n)
{
int
x = (
int
) (Math.ceil(Math.log(n) / Math.log(
2
)));
int
max_size =
2
* (
int
) Math.pow(
2
, x) -
1
;
int
[] st =
new
int
[max_size];
constructSTUtil(arr,
0
, n -
1
, st,
0
);
return
st;
}
public
static
void
main(String[] args)
{
int
arr[] = {
1
,
3
,
5
,
7
,
9
,
11
};
int
n = arr.length;
int
[] st = constructST(arr, n);
System.out.printf(
"Xor of values in given range = %d\n"
,
getXor(st, n,
0
,
2
));
updateValue(arr, st, n,
1
,
10
);
System.out.printf(
"Updated Xor of values in given range = %d\n"
,
getXor(st, n,
0
,
2
));
}
}