Izračunavanje XOR-a za date podnizove

Data je lista arr pozitivnih celih brojeva. Takođe, data je lista upita, gde svaki upit ima oblik [$left_i$,$right_i$]. Za svaki upit, izračunajte XOR elemenata u listi od indeksa $left_i$ do indeksa $right_i$, uključujući oba indeksa. Drugim rečima, za svaki upit, izračunajte XOR podniza od arr[$left_i$] do arr[$right_i$] (uključujući oba indeksa).

Vratićete listu answer, gde je answer[i] rezultat i-tog upita.

Ulaz

Izlaz

Lista answer celih brojeva, gde je answer[i] rezultat XOR operacije za podniz definisan u i-tom upitu.

Primer 1

Ulaz

4 
3
1 3 4 8
0 0
1 3
0 2

Izlaz

1 15 6

Primer 2

Ulaz

4
4
1 3 4 8
0 1
1 2
0 3
3 3

Izlaz

2 7 14 8

Rešenje

main.c

#include <stdio.h>
#include <stdlib.h>

void xor_podnizova(int* arr, int arr_size, int** queries, int queries_size, int* result){
	// rešenje zasnovano na prefiksnim nizovima
	int* prefixXOR = (int*)malloc((arr_size + 1) * sizeof(int));
	prefixXOR[0] = 0;  // prvi element je 0 jer XOR od praznog niza je 0 jer je to neutral
	for (int i = 0; i < arr_size; i++) {
        prefixXOR[i + 1] = prefixXOR[i] ^ arr[i]; 
    }


	for (int i = 0; i < queries_size; i++) {
        int left = queries[i][0];
        int right = queries[i][1];
        
        // XOR za interval [left, right] je prefixXOR[right + 1] ^ prefixXOR[left].
        result[i] = prefixXOR[right + 1] ^ prefixXOR[left];
    }

    free(prefixXOR);
}


int main(void)
{
	int n, m;
	scanf("%d", &n); 
	scanf("%d", &m); 
    
	int* arr = (int*)malloc(n * sizeof(int));
	for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]); 
    }

	int** queries = (int**)malloc(m * sizeof(int*));
	for (int i = 0; i < m; i++) {
        queries[i] = (int*)malloc(2 * sizeof(int));
        scanf("%d %d", &queries[i][0], &queries[i][1]); 
    }

	int* answer = (int*)malloc(m * sizeof(int));

	xor_podnizova(arr, n, queries, m, answer);

	for (int i = 0; i < m; i++) {
        printf("%d ", answer[i]);
    }
    printf("\n");


	free(arr);
    for (int i = 0; i < m; i++) {
        free(queries[i]);
    }
    free(queries);
    free(answer);

	return 0;
}