题目链接:HDU-4027-Can you answer these queries?
一个数最多开平方8次,所以加个剪枝,当区间和等于区间元素数时,不再递归下去,
然后要注意eps开大一点,因为原始数字是long long 的范围。
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
const double eps=1e-10;
ll sum[maxn<<2];
void push_up(int now)
{
sum[now]=sum[now<<1]+sum[now<<1|1];
}
void build(int now,int l,int r)
{
if(l==r)
{
scanf("%I64d",&sum[now]);
return ;
}
int mid=(l+r)>>1;
build(now<<1,l,mid);
build(now<<1|1,mid+1,r);
push_up(now);
}
void update(int now,int l,int r,int ul,int ur)
{
if(l==r)
{
sum[now]=sqrt((long double)sum[now])+eps;
return ;
}
if(ul<=l&&ur>=r&&sum[now]==r-l+1) return ;
int mid=(l+r)>>1;
if(ul<=mid) update(now<<1,l,mid,ul,ur);
if(ur>mid) update(now<<1|1,mid+1,r,ul,ur);
push_up(now);
}
ll query(int now,int l,int r,int ql,int qr)
{
ll res=0;
if(ql<=l&&qr>=r) return sum[now];
int mid=(l+r)>>1;
if(ql<=mid) res+=query(now<<1,l,mid,ql,qr);
if(qr>mid) res+=query(now<<1|1,mid+1,r,ql,qr);
return res;
}
int main()
{
int n,kase=1,l,r,option,m;
while(~scanf("%d",&n))
{
printf("Case #%d:\n",kase++);
build(1,1,n);
scanf("%d",&m);
for(int i=0;i