线段树模板

来源:互联网 发布:少儿英语 知乎 编辑:程序博客网 时间:2024/06/07 04:59
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;const int maxn=10000+10,inf=0x3f3f3f;int a[maxn],tree[maxn*4],mark[maxn*4];int n,m;inline void build(int root,int l,int r){mark[root]=0;if(l==r)tree[root]=a[l];else{int mid=(l+r)/2;build(root*2+1,l,mid);build(root*2+2,mid+1,r);tree[root]=min(tree[root*2+1],tree[root*2+2]);}}inline void pushdown(int x){if(mark[x]){mark[x*2+1]=mark[x];mark[x*2+2]=mark[x];tree[x*2+1]=mark[x];tree[x*2+2]=mark[x];mark[x]=0;}}inline int query(int root,int x,int y,int l,int r){if(x>r || y<l)return inf;if(x<=l && y>=r)return tree[root];pushdown(root);int mid=(l+r)/2;return min(query(root*2+1,x,y,l,mid),query(root*2+2,x,y,mid+1,r));}inline void addone(int root,int l,int r,int x,int y){if(l==r && x==l){tree[root]=y;return ;}if(l==r)return ;int mid=(l+r)/2;if(x<=mid)addone(root*2+1,l,mid,x,y);elseaddone(root*2+2,mid+1,r,x,y);tree[root]=min(tree[root*2+1],tree[root*2+2]);}inline void update(int root,int l,int r,int x,int y,int k){if(x>r || y<l)return ;if(x<=l && y>=r){mark[root]=k;tree[root]=k;return ;}pushdown(root);int mid=(l+r)/2;update(root*2+1,l,mid,x,y,k);update(root*2+2,mid+1,r,x,y,k);tree[root]=min(tree[root*2+1],tree[root*2+2]);}int main(){int i,j,k;freopen("a.in","r",stdin);freopen("a.out","w",stdout);scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);build(1,1,n);cin>>m;while(m--){int x,y,z;cin>>x>>y>>z;update(1,1,n,x,y,z);}int tmp;cin>>tmp;while(tmp--){int x,y;cin>>x>>y;cout<<query(1,x,y,1,n)<<endl;}return 0;}

0 0