线段树模板
2015-08-12 19:58
399 查看
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define LL(x) (x<<1) #define RR(x) (x<<1|1) #define MID(a,b) (a+((b-a)>>2)) #define INF (1<<30) const int N=200005; struct node { int lft,rht,mx,mi,sum; int mid() { return MID(lft,rht); } }; int y ,n,m; struct Segtree { node tree[N*4]; void build(int lft,int rht,int ind ) { tree[ind].lft=lft; tree[ind].rht=rht; tree[ind].mx=-INF; tree[ind].mi=INF; tree[ind].sum=0; if(lft==rht) { tree[ind].mi=y[lft]; tree[ind].mx=y[lft]; tree[ind].sum=y[lft]; } else { int mid=tree[ind].mid(); build(lft,mid,LL(ind)); build(mid+1,rht,RR(ind)); tree[ind].mx=max(tree[LL(ind)].mx,tree[RR(ind)].mx); tree[ind].mi=min(tree[LL(ind)].mi,tree[RR(ind)].mi); tree[ind].sum=tree[LL(ind)].sum+tree[RR(ind)].sum; } } void updata(int pos,int ind,int valu) { int lft=tree[ind].lft,rht=tree[ind].rht; if(lft==rht) { tree[ind].mx=valu; tree[ind].sum=valu; tree[ind].mi=valu; } else { int mid=tree[ind].mid(); if(pos<=mid)updata(pos,LL(ind),valu); else updata(pos,RR(ind),valu); tree[ind].mx=max(tree[LL(ind)].mx,tree[RR(ind)].mx); tree[ind].mi=min(tree[LL(ind)].mi,tree[RR(ind)].mi); tree[ind].sum=tree[LL(ind)].sum+tree[RR(ind)].sum; } } int querymx(int st,int ed,int ind) { int lft=tree[ind].lft,rht=tree[ind].rht; if(st<=lft&&rht<=ed)return tree[ind].mx; else { int mid=tree[ind].mid(); int mx1=-INF,mx2=-INF; if(st<=mid)mx1=querymx(st,ed,LL(ind)); if(ed>mid)mx2=querymx(st,ed,RR(ind)); return max(mx1,mx2); } } int querymi(int st,int ed,int ind) { int lft=tree[ind].lft,rht=tree[ind].rht; if(st<=lft&&rht<=ed)return tree[ind].mi; else { int mid=tree[ind].mid(); int mi1=INF,mi2=INF; if(st<=mid)mi1=querymi(st,ed,LL(ind)); if(ed>mid)mi2=querymi(st,ed,RR(ind)); return min(mi1,mi2); } } int querysum(int st,int ed,int ind) { int lft=tree[ind].lft,rht=tree[ind].rht; if(st<=lft&&rht<=ed)return tree[ind].sum; else { int mid=tree[ind].mid(); int sum1=0,sum2=0; if(st<=mid)sum1=querysum(st,ed,LL(ind)); if(ed>mid)sum2=querysum(st,ed,RR(ind)); return sum1+sum2; } } } seg; int main() { int n,m; while(cin>>n>>m) { for(int i=1; i<=n; i++) cin>>y[i]; seg.build(1,n,1); char s; int st,ed; for(int i=0; i<m; i++) { cin>>s>>st>>ed; if(s=='S')cout<<seg.querysum(st,ed,1)<<endl; if(s=='A')cout<<seg.querymx(st,ed,1)<<endl; if(s=='I')cout<<seg.querymi(st,ed,1)<<endl; } } return 0; }
相关文章推荐
- hdu 2819 Swap
- ObjC第三节:内存管理
- 杭电 1301 Jungle Roads 【最小生成树&&Kruskal】
- 【Baltic2007】【BZOJ1345】序列问题Sequence
- JAVA多线程编程
- Objective-C:在类中设置不同协议
- _00024 尼娜抹微笑伊拉克_云计算ClouderaManager以及CHD5.1.0群集部署安装文档V1.0
- 解决:LNMP架构下访问php页面出现500错误
- 问题-jdbc连接不上mysql,windows下开启两个mysql服务
- Win2008 R2 标准版升级企业版
- OC的nil, Nil, NSNull, NULL和nullptr. 以及josn转换后的(null)和<null>
- 【DP】 HDOJ 5370 Tree Maker
- ShareSDK的使用
- [HDU 2121] Ice_cream’s world II 最小树形图
- HDU 1116 Play on Words
- 快速幂。素数筛选。辗转相除。
- fd to filename
- hdu 1181 变形课 DFS
- JS中如何实现每点击一次按钮,显示一条信息
- win7打不开chm格式文件