给定一个数组 a[]有n 个非负元素。我们有两种类型的查询:
A xyv : 找到 a[i]>v 的第一个索引 i (x<=i<=y)
B uv :更新a[u]=v;
我使用分段树,但在某些测试中它是 TLE。
这是我的代码。
it max(it A,it B)
{
it C;
C.mx=max(A.mx,B.mx);
return C;
}
这是构建第一棵树的函数。
void build(int id,int l,int r)
{
if(l==r)
{
st[id].mx=a[l];
st[id].pos=l;
return;
}
int m=l+r>>1;
build(id<<1,l,m);
build(id<<1|1,m+1,r);
st[id]=max(st[id<<1],st[id<<1|1]);
}
更新查询:
void update(int id,int l,int r,int u,int v)
{
if(u<l||r<u) return;
if(l==r)
{
st[id].mx=v;
return;
}
int m=l+r>>1;
update(id<<1,l,m,u,v);
update(id<<1|1,m+1,r,u,v);
st[id]=max(st[id<<1],st[id<<1|1]);
}
“查找”查询:
int getmin(int id,int l,int r,int u,int v,int value)
{
if(v<l||r<u) return 1e9;
if(l==r)
{
return st[id].pos;
}
int m=l+r>>1;
//cout<<"->"<<id<<" "<<l<<" "<<r<<endl;
if(st[id<<1].mx<=value)
{
if(st[id<<1|1].mx<=value)
return 1e9;
else return getmin(id<<1|1,m+1,r,u,v,value);
}
else
{
if(st[id<<1|1].mx<=value)
return getmin(id<<1,l,m,u,v,value);
else return min(getmin(id<<1,l,m,u,v,value),getmin(id<<1|1,m+1,r,u,v,value));
}
}