From 2ce906f444b29d5af4a4fca1b470b483bf90e966 Mon Sep 17 00:00:00 2001 From: Kirito <1362050620@qq.com> Date: Thu, 11 Aug 2016 10:48:36 +0800 Subject: [PATCH] Create RMQ-ST-System.cpp --- .ACM-Templates/RMQ-ST-System.cpp | 57 ++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 .ACM-Templates/RMQ-ST-System.cpp diff --git a/.ACM-Templates/RMQ-ST-System.cpp b/.ACM-Templates/RMQ-ST-System.cpp new file mode 100644 index 0000000..ef31d8c --- /dev/null +++ b/.ACM-Templates/RMQ-ST-System.cpp @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include +#define INF 0x3f3f3f3f +using namespace std; +const int maxn = 10010; +struct node +{ + int lt,rt,v; +}; +node tree[maxn<<2]; + +/** ========== Conditional =========== */ +using ValueType = int; + +inline ValueType algo_delegate(ValueType a,ValueType b) +{ + return min(a,b); +} +/****************************************/ + +void build(int lt,int rt,int v) +{ + tree[v].lt = lt; + tree[v].rt = rt; + if(lt == rt) + { + scanf("%d",&tree[v].v); + return; + } + int mid = (lt + rt)>>1; + build(lt,mid,v<<1); + build(mid+1,rt,v<<1|1); + tree[v].v = algo_delegate(tree[v<<1].v,tree[v<<1|1].v); +} +void update(int p,int val,int v) +{ + if(tree[v].lt == tree[v].rt) + { + tree[v].v = val; + return; + } + if(p <= tree[v<<1].rt) update(p,val,v<<1); + if(p >= tree[v<<1|1].lt) update(p,val,v<<1|1); + tree[v].v = algo_delegate(tree[v<<1].v,tree[v<<1|1].v); +} +int query(int lt,int rt,int v) +{ + if(tree[v].lt >= lt && tree[v].rt <= rt) + return tree[v].v; + int a = INF,b = INF; + if(lt <= tree[v<<1].rt) a = query(lt,rt,v<<1); + if(rt >= tree[v<<1|1].lt) b = query(lt,rt,v<<1|1); + return algo_delegate(a,b); +}