您的位置:首页 > 其它

线段树模板

2016-11-05 16:31 295 查看
#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);
else
addone(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: