HDU 4027 Can you answer these queries?
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int n,m,x,y,cnt=0;
int tr[400005],a[100005];
inline int _Read()
{
int s=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-f;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
s=s*10+ch-48;
ch=getchar();
}
return s*f;
}
void Build(int l,int r,int iid)
{
if(l==r)
{
tr[iid]=a[l];
return;
}
int mid=l+r>>1;
Build(l,mid,iid<<1);
Build(mid+1,r,iid<<1|1);
tr[iid]=tr[iid<<1]+tr[iid<<1|1];
return;
}
void Update(int l,int r,int x,int iid)
{
if(l==r)
{
tr[iid]=floor(sqrt(1.0*tr[iid]));
return;
}
int mid=l+r>>1;
if(x<=mid)
Update(l,mid,x,iid<<1);
else
Update(mid+1,r,x,iid<<1|1);
tr[iid]=tr[iid<<1]+tr[iid<<1|1];
return;
}
int Query(int l,int r,int x,int y,int iid)
{
if(x<=l&&r<=y)
return tr[iid];
int mid=l+r>>1;
int ans=0;
if(x<=mid)
ans+=Query(l,mid,x,y,iid<<1);
if(y>mid)
ans+=Query(mid+1,r,x,y,iid<<1|1);
return ans;
}
int main()
{
while(~scanf("%d",&n))
{
memset(tr,0,sizeof tr);
memset(a,0,sizeof a);
for(int i=1;i<=n;i++)
a[i]=_Read();
Build(1,n,1);
m=_Read();
printf("Case #%d:\n",++cnt);
for(int i=1;i<=m;i++)
{
int op;
op=_Read();
x=_Read();
y=_Read();
if(!op)
if(Query(1,n,x,y,1)!=y-x+1)
for(int i=x;i<=y;i++)
Update(1,n,i,1);
else
printf("%d\n",Query(1,n,x,y,1));
}
}
return 0;
}