这道题是典型的二维线段树的题目,题目要求查询一个区间的最小值和最大值,并修改一个点。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<cstdlib>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=1010;
struct nodey
{
int l,r;
int max,min;
};
int locy[maxn],locx[maxn];
struct nodex
{
int l,r;
nodey sty[maxn*4];
void build(int i,int _l,int _r)
{
sty[i].l=_l;
sty[i].r=_r;
sty[i].max=-INF;
sty[i].min=INF;
if(_l==_r)
{
locy[_l]=i;
return;
}
int mid=(_l+_r)/2;
build(i<<1,_l,mid);
build((i<<1)|1,mid+1,_r);
}
int querymin(int i,int _l,int _r)
{
if(sty[i].l==_l&&sty[i].r==_r)
return sty[i].min;
int mid=(sty[i].l+sty[i].r)/2;
if(_r<=mid)
return querymin(i<<1,_l,_r);
else if(_l>mid)
return querymin((i<<1)|1,_l,_r);
else
return min(querymin(i<<1,_l,mid),querymin((i<<1)|1,mid+1,_r));
}
int querymax(int i,int _l,int _r)
{
if(sty[i].l==_l&&sty[i].r==_r)
return sty[i].max;
int mid=(sty[i].l+sty[i].r)/2;
if(_r<=mid)
return querymax