做了一部分题目,总结一下线段树的几个基本操作。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int INF=1<<29;
int max_tree[300000];
int min_tree[300000];
int sum_tree[300000];
int a[300000];
void build(int node,int begin,int end){//建树
if(begin==end) min_tree[node]=a[begin],max_tree[node]=a[begin],sum_tree[node]=a[begin];
else{
build(2*node,begin,(begin+end)/2);
build(2*node+1,(begin+end)/2+1,end);
max_tree[node]=max(max_tree[2*node],max_tree[2*node+1]);
min_tree[node]=min(min_tree[2*node],min_tree[2*node+1]);
sum_tree[node]=sum_tree[2*node]+sum_tree[2*node+1];
}
}
int findmin(int node,int begin,int end,int z,int y){//找到z--y的最小值
int p1=INF,p2=INF;
if(begin>=z&&end<=