算法模板-线段树区间最值

牛客裸题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+5;
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
int a[maxn];
int n,q;
struct node{
	int l,r;
	int mx,mi;// 区间最值 
}t[maxn*4];
void pushup(int p)
{
	t[p].mx = max( t[ls(p)].mx,t[rs(p)].mx );
	t[p].mi = min( t[ls(p)].mi,t[rs(p)].mi );
}
void build(int p,int l,int r)
{
	t[p].l = l, t[p].r = r;
	if( l==r )
	{
		t[p].mi = t[p].mx = a[l];
		return ;
	}
	int mid = (l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	pushup(p);
}
// 单点修改 
void update(int p,int x,int y)
{
	if( t[p].l==x && t[p].r==x )
	{
		t[p].mi = t[p].mx = y;
		return ;
	}
	int mid = (t[p].l+t[p].r)>>1;
	if( x<=mid ) update(ls(p),x,y);
	else update(rs(p),x,y);
	pushup(p);
}
int query_mx(int p,int l,int r)
{
	if( l<=t[p].l && t[p].r<=r ) return t[p].mx;
	int mid = (t[p].l+t[p].r)>>1;
	int ans = -1e9;
	if( l<=mid ) ans = max( ans , query_mx(ls(p),l,r) );
	if( r>=mid+1 ) ans = max( ans,query_mx(rs(p),l,r) );
	return ans;
}
int query_mi(int p,int l,int r)
{
	if( l<=t[p].l && t[p].r<=r ) return t[p].mi;
	int mid = (t[p].l+t[p].r)>>1;
	int ans = 1e9;
	if( l<=mid ) ans = min( ans , query_mi(ls(p),l,r) );
	if( r>=mid+1 ) ans = min( ans,query_mi(rs(p),l,r) );
	return ans;
}
int main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(q--)
	{
		int op; cin>>op;
		if( op==1 )
		{
			int x,y; cin>>x>>y;
			update(1,x,y);
		}
		else 
		{
			int l,r; cin>>l>>r;
			int ans = query_mx(1,l,r)-query_mi(1,l,r) == r-l;
			printf("%s\n",ans?"YES":"NO");
		}
	}
	return 0;
}



posted @ 2020-09-05 09:17  特立独行的猪猪  阅读(88)  评论(0编辑  收藏  举报