class GFG
{
static query(start, end, left, right, node, seg)
{
if
(end < left || start > right)
{
return
0;
}
else
if
(start >= left && end <= right)
{
return
seg[node];
}
else
{
var
mid = parseInt((start + end) / 2);
var
leftChild = GFG.query(start, mid, left, right, 2 * node, seg);
var
rightChild = GFG.query(mid + 1, end, left, right, 2 * node + 1, seg);
return
(leftChild | rightChild);
}
}
static update(left, right, index, Value, node, ar, seg)
{
if
(left == right)
{
ar[index] = Value;
seg[node] = (1 << Value);
return
;
}
var
mid = parseInt((left + right) / 2);
if
(index > mid)
{
GFG.update(mid + 1, right, index, Value, 2 * node + 1, ar, seg);
}
else
{
GFG.update(left, mid, index, Value, 2 * node, ar, seg);
}
seg[node] = (seg[2 * node] | seg[2 * node + 1]);
}
static build(left, right, node, ar, seg)
{
if
(left == right)
{
seg[node] = (1 << ar[left]);
return
;
}
var
mid = parseInt((left + right) / 2);
GFG.build(left, mid, 2 * node, ar, seg);
GFG.build(mid + 1, right, 2 * node + 1, ar, seg);
seg[node] = (seg[2 * node] | seg[2 * node + 1]);
}
static getDistinctCount(queries, ar, seg, n)
{
for
(
var
i = 0; i < queries.length; i++)
{
var
op = queries[i][0];
if
(op == 2)
{
var
l = queries[i][1];
var
r = queries[i][2];
var
tempMask = GFG.query(0, n - 1, l - 1, r - 1, 1, seg);
var
countOfBits = 0;
for
(
var
s = 32; s >= 0; s--)
{
if
((tempMask & (1 << s)) > 0)
{
countOfBits++;
}
}
console.log(countOfBits+
"<br>"
);
}
else
{
var
index = queries[i][1];
var
val = queries[i][2];
GFG.update(0, n - 1, index - 1, val, 1, ar, seg);
}
}
}
static main(args)
{
var
n = 7;
var
ar = [1, 2, 1, 3, 1, 2, 1];
var
seg = Array(4 * n).fill(0);
GFG.build(0, n - 1, 1, ar, seg);
var
queries = [[2, 1, 4], [1, 4, 2], [1, 5, 2], [2, 4, 6], [2, 1, 7]];
GFG.getDistinctCount(queries, ar, seg, n);
}
}
GFG.main([]);