题意:求最小的线段树的右端点(根节点表示区间[0,n]),使得给定的区间[L,R]是线段树的某个节点。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long
const LL inf=0x3f3f3f3f3f3f3f3f;
LL ans;
void dfs(LL l,LL r)
{
if(l==0)
{
ans=min(ans,r);
return;
}
if(r>=ans||l<0)
{
return;
}
if(r-l+1>l)
{
return;
}
dfs(2*l-r-2,r);
dfs(2*l-r-1,r);
dfs(l,2*r-l);
dfs(l,2*r-l+1);
}
int main()
{
LL l,r;
while(scanf("%lld%lld",&l,&r)!=EOF)
{
ans=inf;
dfs(l,r);
if(ans==inf)
{
printf("-1\n");
}
else
{
printf("%lld\n",ans);
}
}
return 0;
}