Submission #1296537

#TimeUsernameProblemLanguageResultExecution timeMemory
1296537Ekber_EkberXORanges (eJOI19_xoranges)C++20
100 / 100
85 ms11232 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#define GOOD_LUCK ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define int long long
#define itn int
#define endl "\n"
#define ff first
#define ss second
#define pb push_back
#define ppb pop_back
#define ins insert
#define lb lower_bound
#define ub upper_bound
#define bs binary_search
#define count1 __builtin_popcount
#define all(v) v.begin(), v.end()
#define unset unordered_set
#define unmap unordered_map
#define pqueue priority_queue
#define ordered_set_less tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define ordered_set_greater tree<int, null_type, greater<int>, rb_tree_tag, tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_pbds;

struct point{

};

int ctoi(char x) {
	return (int)x - '0';
}

int sumab(int a, int b) {
	return (a + b) * (b - a + 1) / 2;
}

int gcd(int a, int b) {
	return (b == 0 ? a : gcd(b, a % b));
}

int lcm(int a, int b) {
	return a / gcd(a, b) * b;
}

void print(vector <auto> &v) {
	for (const auto &i : v) cout << i << ' ';
}

void print_p(vector <pair<auto, auto>> &v) {
	for (const auto &i : v) cout << i.ff << ' ' << i.ss << endl;
}

int compress(int n, vector <int> &v) {
	vector <pair<int, int>> x(n);
	for (int i=0; i < n; i++) {
		x[i] = {v[i], i};
	}
	sort(all(x));
	int nxt=1;
	for (int i=0; i < n-1; i++) {
		if (x[i].ff == x[i+1].ff) {
			x[i].ff = nxt;
		}
		else x[i].ff = nxt++;
	}
	x[x.size()-1].ff = nxt;
	for (int i=0; i < n; i++) {
		swap(x[i].ff, x[i].ss);
	}
	sort(all(x));
	for (int i=0; i < n; i++) {
		v[i] = x[i].ss;
	}
	return nxt;
}

int compress_p(int n, vector <pair<int, int>> &v) {
	vector <pair<int, int>> q;
	for (int i=0; i < n; i++) {
		q.pb({v[i].ff, i});
		q.pb({v[i].ss, i});
	}
	sort(all(q));
	int nxt=0;
	for (int i=0; i < 2 * n - 1; i++) {
		if (q[i].ff == q[i+1].ff) q[i].ff = nxt;
		else q[i].ff = nxt++;
	}
	q.back().ff = nxt;
	for (auto &i : q) swap(i.ff, i.ss);
	sort(all(q));
	for (int i=0; i < 2*n; i+=2) {
		v[i/2].ff = q[i].ss;
		v[i/2].ss = q[i+1].ss;
	}
	return nxt;
}

void timelimit() {
	int x = 1e+9;
	while (x--) x++;
}

void runtime() {
	int x = 1, y = 0;
	cout << x / y;
}

constexpr int MAX = 1e+5 + 3, INF = 2e+9, MOD = 1e+9 + 7, K = 18;

int temp, temp1, temp2, temp3;

struct SegmentTree {
	int n;
	vector <int> a, t;
	SegmentTree (int _n, vector <int>& v) {
		n = _n;
		t.assign(4*n, 0);
		a = v;
	}
	void merge(int &x, int &y, int &z) {
		x = (y ^ z);
	}
	void build(int v, int tl, int tr) {
		if (tl == tr) {
			t[v] = a[tl];
			return;
		}
		int tm = (tl + tr) / 2;
		build(v*2, tl, tm);
		build(v*2+1, tm+1, tr);
		merge(t[v], t[v*2], t[v*2+1]);
	}
	int find(int v, int tl, int tr, int l, int r) {
		if (l > r) return 0;
		if (tl == l && tr == r) {
			return t[v];
		}
		int tm = (tl + tr) / 2;
		int res1 = find(v*2, tl, tm, l, min(r, tm));
		int res2 = find(v*2+1, tm+1, tr, max(l, tm+1), r);
		int res;
		merge(res, res1, res2);
		return res;
	}
	void update(int v, int tl, int tr, int i, int x) {
		if (tl == tr) {
			t[v] = x;
			a[tl] = x;
			return;
		}
		int tm = (tl + tr) / 2;
		if (i <= tm) {
			update(v*2, tl, tm, i, x);
		}
		else {
			update(v*2+1, tm+1, tr, i, x);
		}
		merge(t[v], t[v*2], t[v*2+1]);
	}
	int get(int l, int r) {
		return find(1, 0, n-1, l, r);
	}
	void upd(int i, int x) {
		update(1, 0, n-1, i, x);
	}
};

void _() {
	int n, q;
	cin >> n >> q;
	vector <int> a, b;
	for (int i=1; i <= n; i++) {
		cin >> temp;
		if (i % 2) a.pb(temp);
		else b.pb(temp);
	}
    // for (int &i : a) cout << i << ' '; cout << endl;
    // for (int &i : b) cout << i << ' '; cout << endl;
	SegmentTree ta(a.size(), a), tb(b.size(), b);
    ta.build(1, 0, a.size()-1);
    tb.build(1, 0, b.size()-1);
	while (q--) {
		int d, x, y;
		cin >> d >> x >> y;
		if (d == 1) {
			--x;
			if (x % 2 == 0) {
				ta.upd(x / 2, y);
			}
			else {
				tb.upd(x / 2, y);
			}
		}
		else {
			int sz = y - x + 1;
			--x, --y;
			if (sz % 2 == 0) {
				cout << "0\n";
				continue;
			}
			if (x % 2 == 0) {
				cout << ta.get(x/2, y/2);
			}
			else {
				cout << tb.get(x/2, y/2);
			}
			cout << endl;
		}
	}
}

signed main() {

	GOOD_LUCK

//	freopen("input.txt", "r", stdin);
//	freopen("output.txt", "w", stdout);
	freopen("log.txt", "w", stderr);
	srand(time(0));

	int tests=1;
//	cin >> tests;
	for (int i=1; i <= tests; i++) {
//		cout << "Case #" << i << ": ";
		_();
//		cout << endl;
	}

//	int n;
//	while (cin >> n) {
//		_(n);
//		cout << endl;
//	}

	return 0;
}
// Problem X
// by Ekber_Ekber
/*

*/

Compilation message (stderr)

xoranges.cpp: In function 'int main()':
xoranges.cpp:220:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  220 |         freopen("log.txt", "w", stderr);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...