线段树模板

来源:互联网 发布:单片机电子密码锁编程 编辑:程序博客网 时间:2024/05/30 23:04
#include <stdio.h>#include <string.h>int qq[200005];int max(int a,int b){if(a<b)return b;return a;}struct node{int left,right,max;int mid(){return (left+right)/2;}}q[600005];int build(int a,int b,int c){q[c].left=a;q[c].right=b;if(a==b)return q[c].max=qq[a];int mid=(a+b)/2;return q[c].max=max(build(a,mid,2*c),build(mid+1,b,c*2+1));}int que11(int a,int b,int c){if(q[c].left==a&&b==q[c].right)return q[c].max;int mid=q[c].mid();if(a>mid)return que11(a,b,2*c+1);else if(b<=mid)return que11(a,b,2*c);elsereturn max(que11(a,mid,2*c),que11(mid+1,b,2*c+1));}void jia(int a,int b,int c){if(q[c].left==q[c].right){q[c].max=b;return ;}int mid=q[c].mid();if(a<=mid)jia(a,b,2*c);elsejia(a,b,2*c+1);q[c].max=max(q[c*2].max,q[c*2+1].max);}




数组版

#include <cstdio> #define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1const int maxn = 55555;int sum[maxn<<2];void PushUP(int rt) {sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void build(int l,int r,int rt) {if (l == r) {scanf("%d",&sum[rt]);return ;}int m = (l + r) >> 1;build(lson);build(rson);PushUP(rt);}void update(int p,int add,int l,int r,int rt) {if (l == r) {sum[rt] += add;return ;}int m = (l + r) >> 1;if (p <= m) update(p , add , lson);else update(p , add , rson);PushUP(rt);}int query(int L,int R,int l,int r,int rt) {if (L <= l && r <= R) {return sum[rt];}int m = (l + r) >> 1;int ret = 0;if (L <= m) ret += query(L , R , lson);if (R > m) ret += query(L , R , rson);return ret;}


0 0
原创粉丝点击