Cod sursa(job #3317804)

Utilizator Cezar2009Cezar Mihai Titihazan Cezar2009 Data 25 octombrie 2025 13:34:44
Problema Xor Max Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
//https://infoarena.ro/problema/xormax

#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("fast-math")
#pragma GCC optimize ("unroll-loops")
#define _USE_MATH_DEFINES

#include <iostream>
#include <fstream>
//#include <vector>
#include <cstring>
//#include <cmath>
//#include <bitset>
//#include <queue>
//#include <stack>
//#include <utility>
#include <algorithm>
//#include <string>
//#include <map>
//#include <unordered_map>
//#include <set>
//#include <unordered_set>
//#include <cstdint>
//#include <climits>
//#include <iomanip>
//#include <cstdio>
//#include <tuple>

using namespace std;

ifstream fin("xormax.in");
ofstream fout("xormax.out");

const int NRMAX = 100000;
const int NRCIF = 21;
int v[NRMAX + 5];

struct Nod
{
	int ind;

	Nod* ch[2];

	Nod() : ind{ 0 }, ch {} {};
};

void insert(Nod* nod, int x, int ind)
{
	for (int i = NRCIF - 1; i >= 0; --i)
	{
		int nr = (x >> i) & 1;
		if (!nod->ch[nr])
			nod->ch[nr] = new Nod();
		nod = nod->ch[nr];
	}
	nod->ind = ind;
}

int rezolvare(Nod* nod, int x)
{
	for (int i = NRCIF - 1; i >= 0; --i)
	{
		int nr = (x >> i) & 1;
		int invnr = nr ^ 1;
		if (nod->ch[invnr])
			nod = nod->ch[invnr];
		else
			nod = nod->ch[nr];
	}
	return nod->ind;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, i, x, ix = 0;
	int rez = 0, st = 1, dr = 1;

	Nod* rad = new Nod();
	insert(rad, 0, 0);

	fin >> n;
	for (i = 1; i <= n; ++i)
	{
		fin >> x;
		ix ^= x;
		v[i] = ix;
		insert(rad, ix, i);

		int nr = rezolvare(rad, ix);
		if ((v[i] ^ v[nr]) > rez)
		{
			rez = v[i] ^ v[nr];
			st = nr + 1;
			dr = i;
		}
	}

	fout << rez << " " << st << " " << dr;

	return 0;
}