#include <bits/stdc++.h>
using namespace std;
struct Nod {
int minim = INT32_MAX;
Nod *stanga = NULL , *dreapta = NULL;
} *radacina = new Nod;
inline void Insert (Nod* &nod , const int valoare , const int candidat , const int putere)
{
nod -> minim = min(nod -> minim , candidat);
if (putere == 0)
{ return; }
if (valoare & putere)
{
if (!nod -> dreapta)
{ nod -> dreapta = new Nod; }
Insert(nod -> dreapta , valoare , candidat , putere >> 1);
}
else
{
if (!nod -> stanga)
{ nod -> stanga = new Nod; }
Insert(nod -> stanga , valoare , candidat , putere >> 1);
}
}
inline int Query (Nod* &nod , const int termen , const int minim , const int putere)
{
if (nod == NULL)
{ return INT32_MAX; }
if (putere == 0)
{ return nod -> minim; }
if (minim & putere)
{ return Query((termen & putere) ? nod -> stanga : nod -> dreapta , termen , minim , putere >> 1); }
int candidat = Query((termen & putere) ? nod -> dreapta : nod -> stanga , termen , minim , putere >> 1);
if (((termen & putere) ? nod -> stanga : nod -> dreapta) != NULL)
{ candidat = min(candidat , ((termen & putere) ? nod -> stanga : nod -> dreapta) -> minim); }
return candidat;
}
int main ()
{
ios :: sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int lungime , minim;
cin >> lungime >> minim;
int inceput = -1 , maxim = INT32_MIN;
Insert(radacina , 0 , 0 , (1 << 29));
for (int indice = 1 , valoare , suma = 0 ; indice <= lungime ; indice++)
{
cin >> valoare;
suma ^= valoare;
const int candidat = Query(radacina , suma , minim , (1 << 29));
if (indice - candidat > maxim)
{ inceput = candidat + 1; maxim = indice - candidat; }
Insert(radacina , suma , indice , (1 << 29));
}
cout << inceput << ' ' << maxim;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |