标签:数据结构
10 1 2 3 4 5 6 7 8 9 10 5 0 1 10 1 1 10 1 1 5 0 5 8 1 4 8
Case #1: 19 7 6
#include<cstdio>
#include<math.h>
#include<iostream>
using namespace std;
int N,M;
__int64 a[100010];
struct node
{
int left,right;
bool flag;//标记该值是否为‘1’,
__int64 power;
}p[400040];
void build(int i,int l,int r)
{
p[i].left=l;
p[i].right=r;
p[i].flag=1;
if(l==r)
{
p[i].power=a[l];
if(a[l]<=1)p[i].flag=0;
return ;
}
int m=(l+r)/2;
build(i*2,l,m);
build(i*2+1,m+1,r);
p[i].power=p[i*2].power+p[i*2+1].power;
p[i].flag=p[i*2].flag||p[i*2+1].flag;
}
void update(int i,int l,int r)
{
if(p[i].flag==0)return ;
if(p[i].left==p[i].right&&p[i].left==l&&p[i].right==r)
{
p[i].power=(__int64)sqrt(1.0*p[i].power);
if(p[i].power<=1)p[i].flag=0;
return ;
}
int m=(p[i].left+p[i].right)/2;
if(r<=m)
update(i*2,l,r);
else if(l>m)
update(i*2+1,l,r);
else
{
update(i*2,l,m);
update(i*2+1,m+1,r);
}
p[i].power=p[i*2].power+p[i*2+1].power;
p[i].flag=p[i*2].flag||p[i*2+1].flag;
}
__int64 query(int i,int l,int r)
{
if(p[i].left==l&&p[i].right==r)
return p[i].power;
__int64 ans=0;
int m=(p[i].left+p[i].right)/2;
if(r<=m)ans+=query(i*2,l,r);
else if(l>m)ans+=query(i*2+1,l,r);
else ans+=(query(i*2,l,m)+query(i*2+1,m+1,r));
return ans;
}
int main()
{
int k=1,i,x,y,z,mm,b;
while(scanf("%d",&N)!=EOF)
{
for(i=1;i<=N;i++)
scanf("%I64d",&a[i]);
build(1,1,N);
printf("Case #%d:\n",k++);
scanf("%d",&M);
while(M--)
{
scanf("%d%d%d",&x,&mm,&b);
z=mm>b?mm:b;
y=mm>b?b:mm;
if(x==0)
update(1,y,z);
if(x==1)
printf("%I64d\n",query(1,y,z));
}
printf("\n");//天坑,一来是没看出来,。。。。
}
return 0;
}
hdu4027-Can you answer these queries?(线段树),布布扣,bubuko.com
hdu4027-Can you answer these queries?(线段树)
标签:数据结构
原文地址:http://blog.csdn.net/jiangx1994/article/details/38441531