using
System;
using
System.Collections.Generic;
class
GFG{
static
int
[,]prefixCount =
new
int
[32, 10000];
static
void
findPrefixCount(List<
int
> arr,
int
size)
{
for
(
int
i = 0; i < 32; i++)
{
prefixCount[i, 0] = ((arr[0] >> i) & 1);
for
(
int
j = 1; j < size; j++)
{
prefixCount[i, j] = ((arr[j] >> i) & 1);
prefixCount[i, j] += prefixCount[i, j - 1];
}
}
}
static
void
arrayBitwiseAND(
int
size)
{
int
result = 0;
for
(
int
i = 0; i < 32; i++)
{
int
temp = prefixCount[i, size - 1];
if
(temp == size)
result = (result | (1 << i));
}
Console.Write(result +
" "
);
}
static
void
applyQuery(
int
currentVal,
int
newVal,
int
size)
{
for
(
int
i = 0; i < 32; i++)
{
int
bit1 = ((currentVal >> i) & 1);
int
bit2 = ((newVal >> i) & 1);
if
(bit2 > 0 && bit1 == 0)
prefixCount[i, size - 1]++;
else
if
(bit1 > 0 && bit2 == 0)
prefixCount[i, size - 1]--;
}
}
static
void
findbitwiseAND(
int
[,]queries,
List<
int
> arr,
int
N,
int
M)
{
findPrefixCount(arr, N);
for
(
int
i = 0; i < M; i++)
{
int
id = queries[i,0];
int
newVal = queries[i,1];
int
currentVal = arr[id];
arr[id] = newVal;
applyQuery(currentVal, newVal, N);
arrayBitwiseAND(N);
}
}
public
static
void
Main()
{
List<
int
> arr =
new
List<
int
>(){ 1, 2, 3, 4, 5 };
int
[,] queries =
new
int
[3, 2]{ { 0, 2 },
{ 3, 3 },
{ 4, 2 } };
int
N = arr.Count;
int
M = 3;
findbitwiseAND(queries, arr, N, M);
}
}