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<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#define N 100010
#define Mod 10000007
#define lson l,mid,idx<<1
#define rson mid+1,r,idx<<1|1
#define lc idx<<1
#define rc idx<<1|1
const double EPS = 1e-11;
const double PI = acos ( -1.0 );
const double E = 2.718281828;
typedef long long ll;
const int INF = 1000010;
using namespace std;
struct node
{
__int64 sum;
int op;//1:区间全为1 0:不全为1
} tree[N<<2];
int n,m;
void push_up(int idx)
{
tree[idx].sum=tree[lc].sum+tree[rc].sum;
tree[idx].op=(tree[lc].op==1&&tree[rc].op==1);
}
void build(int l,int r,int idx)
{
tree[idx].op=0;
if(l==r)
{
scanf("%I64d",&tree[idx].sum);
return;
}
int mid=(l+r)>>1;
build(lson);
build(rson);
push_up(idx);
}
void update(int l,int r,int idx,int x,int y)
{
if(tree[idx].op==1)
return;
if(l==r)
{
tree[idx].sum=sqrt(double(tree[idx].sum));
if(tree[idx].sum==1)
tree[idx].op=1;
return;
}
int mid=(l+r)>>1;
if(x<=mid)
update(lson,x,y);
if(y>mid)
update(rson,x,y);
push_up(idx);
}
__int64 query(int l,int r,int idx,int x,int y)
{
if(x<=l&&r<=y)
return tree[idx].sum;
__int64 ans=0;
int mid=(l+r)>>1;
if(x<=mid)
ans+=query(lson,x,y);
if(y>mid)
ans+=query(rson,x,y);
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
int ca=1;
while(~scanf("%d",&n))
{
build(1,n,1);
scanf("%d",&m);
printf("Case #%d:\n",ca++);
int x,y,op;
while(m--)
{
scanf("%d%d%d",&op,&x,&y);
if(x>y)
swap(x,y);
if(op)
printf("%I64d\n",query(1,n,1,x,y));
else
update(1,n,1,x,y);
}
printf("\n");
}
return 0;
}
Hdu 4027 Can you answer these queries?(线段树)
原文:http://blog.csdn.net/acm_baihuzi/article/details/43062983