using
System;
class
GFG{
static
void
updateBIT(
int
[] BITree,
int
n,
int
index,
int
val)
{
index = index + 1;
while
(index <= n)
{
BITree[index] = (val + BITree[index]);
index = (index + (index & (-index)));
}
return
;
}
static
int
[] constructBITree(
int
n)
{
int
[] BITree =
new
int
[n + 1];
for
(
int
i = 1; i <= n; i++)
BITree[i] = 0;
return
BITree;
}
static
int
getSum(
int
[] BITree,
int
index)
{
int
sum = 0;
index = index + 1;
while
(index > 0)
{
sum = (sum + BITree[index]);
index -= index & (-index);
}
return
sum;
}
static
void
update(
int
[] BITree,
int
l,
int
r,
int
n,
int
val)
{
updateBIT(BITree, n, l, val);
updateBIT(BITree, n, r + 1, -val);
return
;
}
static
public
void
Main()
{
int
n = 5, m = 5;
int
[] temp = { 1, 1, 2, 1, 4, 5, 2,
1, 2, 2, 1, 3, 2, 3, 4 };
int
[,] q =
new
int
[6, 3];
int
j = 0;
for
(
int
i = 1; i <= m; i++)
{
q[i, 0] = temp[j++];
q[i, 1] = temp[j++];
q[i, 2] = temp[j++];
}
int
[] BITree = constructBITree(m);
int
[] BITree2 = constructBITree(n);
for
(
int
i = m; i >= 1; i--)
if
(q[i, 0] == 2)
update(BITree, q[i, 1] - 1,
q[i, 2] - 1, m, 1);
for
(
int
i = m; i >= 1; i--)
{
if
(q[i,0] == 2)
{
int
val = getSum(BITree, i - 1);
update(BITree, q[i, 1] - 1,
q[i, 2] - 1, m, val);
}
}
for
(
int
i = m; i >= 1; i--)
{
if
(q[i,0] == 1)
{
int
val = getSum(BITree, i - 1);
update(BITree2, q[i, 1] - 1, q[i, 2] - 1,
n, (val + 1));
}
}
for
(
int
i = 1; i <= n; i++)
Console.Write(getSum(BITree2, i - 1) +
" "
);
}
}