Pagini recente » Cod sursa (job #1658979) | Cod sursa (job #665061) | Cod sursa (job #2275976) | Cod sursa (job #2012500) | Cod sursa (job #2079979)
#include <iostream>
#include <cstdio>
using namespace std;
struct nod
{
int cost;
nod *fii[2];
nod()
{
fii[0]=fii[1]=0;
cost=0;
}
}*r;
int val[100005];
void adaugare(nod *&n, int nr, int grad, int poz)
{
if(grad==-1)
{
n->cost=poz;
return ;
}
bool v=nr&(1<<grad);
if(!n->fii[v])
n->fii[v]=new nod();
adaugare(n->fii[v],nr,grad-1,poz);
}
int caut(nod *n, int nr, int grad)
{
if(grad==-1)
return n->cost;
bool v=nr&(1<<grad);
if(!n->fii[!v])
return caut(n->fii[v],nr,grad-1);
return caut(n->fii[!v],nr,grad-1);
}
int main()
{
freopen("xormax.in","r",stdin);
freopen("xormax.out","w",stdout);
r=new nod();
int n,x;
int rez=-1,s,f,loc,p;
adaugare(r,0,21,0);
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>val[i];
val[i]^=val[i-1];
p=caut(r,val[i],21);
loc=val[i]^val[p];
if(loc>rez)
{
rez=loc;
s=p+1;
f=i;
}
adaugare(r,val[i],21,i);
}
printf("%d %d %d", rez,s,f);
return 0;
}