Submission #639998

#TimeUsernameProblemLanguageResultExecution timeMemory
639998maks007XORanges (eJOI19_xoranges)C++14
100 / 100
155 ms11212 KiB
#include "bits/stdc++.h"

#define N (int)1e5

std::vector <int> t1, t2;
int k ;

void update1(const int pos, const int val, int vl = 0, int vr = k - 1, int v = 0) {
	if(vl == vr) {
		t1[v] = val;
		return;
	}
	int vm = (vl + vr) / 2;
	if(pos <= vm) update1(pos, val, vl, vm, 2*v+1);
	else update1(pos, val, vm+1, vr, 2*v+2);
	t1[v] = t1[2*v+1] ^ t1[2*v+2];
}

void update2(const int pos, const int val, int vl = 0, int vr = k - 1, int v = 0) {
	if(vl == vr) {
		t2[v] = val;
		return;
	}
	int vm = (vl + vr) / 2;
	if(pos <= vm) update2(pos, val, vl, vm, 2*v+1);
	else update2(pos, val, vm+1, vr, 2*v+2);
	t2[v] = t2[2*v+1] ^ t2[2*v+2];
}

int get1(const int l, const int r, int vl = 0, int vr = k - 1, int v = 0) {
	if(l > vr  || vl > r) return 0;
	if(l <= vl && vr <= r) return t1[v];
	int vm = (vl + vr ) / 2;
	return get1(l, r, vl, vm, 2*v+1) ^ get1(l, r, vm+1, vr, 2*v+2);
}

int get2(const int l, const int r, int vl = 0, int vr = k - 1, int v = 0) {
	if(l > vr  || vl > r) return 0;
	if(l <= vl && vr <= r) return t2[v];
	int vm = (vl + vr ) / 2;
	return get2(l, r, vl, vm, 2*v+1) ^ get2(l, r, vm+1, vr, 2*v+2);
}

signed main () {
	int n, q;
	scanf("%d%d", &n, &q);
	k= 1;
	while(k < n) k <<= 1;
	t1.resize(2*k-1,0);
	t2.resize(2*k-1.0);
	int a[n];
	for(int i = 0; i < n; i ++) scanf("%d", &a[i]);
	for(int i = 0; i < n; i ++) {
		if(i % 2== 0) update1(i, a[i]);
		else update2(i, a[i]);
	}
	while(q --) {
		int type;
		scanf("%d", &type);
		if(type == 1) {
			int i, x;
			scanf("%d%d", &i, &x);
			i --;
			if(i % 2== 0) update1(i, x);
			else update2(i, x);
		}else {
			int l, r;
			scanf("%d%d", &l, &r);
			l --;
			if((r-l) % 2 == 0) {
				printf("0\n");
				continue;
			}
			int ans = 0;
			if(l % 2 == 0) {
				ans = get1(l, r-1);
			}else {
				ans = get2(l, r-1);
			}
			printf("%d\n", ans);
		}
	}
	return 0;
}

Compilation message (stderr)

xoranges.cpp: In function 'int main()':
xoranges.cpp:46:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   46 |  scanf("%d%d", &n, &q);
      |  ~~~~~^~~~~~~~~~~~~~~~
xoranges.cpp:52:35: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   52 |  for(int i = 0; i < n; i ++) scanf("%d", &a[i]);
      |                              ~~~~~^~~~~~~~~~~~~
xoranges.cpp:59:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |   scanf("%d", &type);
      |   ~~~~~^~~~~~~~~~~~~
xoranges.cpp:62:9: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |    scanf("%d%d", &i, &x);
      |    ~~~~~^~~~~~~~~~~~~~~~
xoranges.cpp:68:9: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |    scanf("%d%d", &l, &r);
      |    ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...