Ranged XOR

Given L and R, find the value of XOR of all elements from L to R (both inclusive) and the number of unset bits (0's) in the given range of the array.

Example:

Input:  n = 5, v={1,0,0,0,1}, l=2, r=4
Output: 0 3

Approach

C++

#include <bits/stdc++.h>
using namespace std;

int arr[1000000];
int tree1[2000010];
int tree[20000010];
void build(int nodeint startint end)
{
    if (start == end)
    {
        tree[node] = arr[start];
    }
    else
    {
        int mid = (start + end) / 2;
        build(2 * nodestartmid);
        build(2 * node + 1mid + 1end);
        tree[node] = tree[2 * node] ^ tree[2 * node + 1];
    }
}
int query(int nodeint startint endint lint r)
{
    if (r < start || l > end)
        return 0;
    if (l <= start && r >= end)
        return tree[node];
    else
    {
        int mid = (start + end) / 2;
        int p1 = query(2 * nodestartmidlr);
        int p2 = query(2 * node + 1mid + 1endlr);
        return p1 ^ p2;
    }
}
void build1(int nodeint startint end)
{
    if (start == end)
    {
        if (arr[start] == 0)
            tree1[node] = 1;
        else
            tree1[node] = 0;
    }
    else
    {
        int mid = (start + end) / 2;
        build1(2 * nodestartmid);
        build1(2 * node + 1mid + 1end);
        tree1[node] = tree1[2 * node] + tree1[2 * node + 1];
    }
}
int query1(int nodeint startint endint lint r)
{
    if (r < start || l > end)
        return 0;
    if (l <= start && r >= end)
        return tree1[node];
    else
    {
        int mid = (start + end) / 2;
        int p1 = query1(2 * nodestartmidlr);
        int p2 = query1(2 * node + 1mid + 1endlr);
        return p1 + p2;
    }
}
int main()
{

    int n = 5;

    vector<intv = {10001};

    for (int i = 1i <= ni++)
        arr[i] = v[i - 1];
    build1(11n);
    build(11n);

    int l = 2r = 4;

    int ans = query(11nlr);
    int ans2 = query1(11nlr);
    cout << ans << " " << ans2 << "\n";

    return 0;
}


No comments:

Post a Comment