[数据结构]线段树(二)

2014-11-24 13:25:44 · 作者: · 浏览: 66
查到该节点就直接返回其sum值即可,无需向下查询到叶子节点 // 如果没有的话,那么就得查询到叶子节点,把叶子节点的sum值相加 // if(segTree[i].l==segTree[i].r)//这一句写的大错特错!!!定要注意 // return segTree[i].sum; if(segTree[i].l==l&&segTree[i].r==r) return segTree[i].sum; int ans=0; int mid=((segTree[i].l+segTree[i].r)>>1); if(r<=mid) ans=Sum(i<<1,l,r); else if(l>mid) ans=Sum((i<<1)|1,l,r); else ans=Sum(i<<1,l,mid)+Sum((i<<1)|1,mid+1,r); return ans; } int main() { char cm[10]; int n; int t;scanf(%d,&t); int p,add,l,r; for(int cas=1;cas<=t;++cas) { printf(Case %d: ,cas); scanf(%d,&n); Build(1,1,n); while(scanf(%s,cm)) { if(cm[0]=='E') break; if(cm[0]=='A') { scanf(%d%d,&p,&add); Add(1,p,add); } else if(cm[0]=='S') { scanf(%d%d,&p,&add); Add(1,p,-add); } else { scanf(%d%d,&l,&r); printf(%d ,Sum(1,l,r)); } } } return 0; }