地址:当小威遇上经济危机
有谁能帮忙看一下这道题,我用的是线段树的算法,但是中间的tmp值一直是都是0,每次都输出No,应该是query函数的问题,但是无奈本人太弱查不出来,各位大佬能否帮忙看一下
中间可能有些调试语句没删干净,请见谅
代码:
#include <bits/stdc++.h>
#define gcd(a,b) b?gcd(b,a%b):a
#define lcm(a,b) a/(gcd(a,b))*b
#define lowbit(x) x&(-x)
using namespace std;
using ll=long long;
using ull=unsigned long long;
using pi=pair<int,int>;
using pll=pair<ll,ll>;
const int MAXN=2e5+5;
const int INF=INT_MAX;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int n,m,edge_cnt,node_cnt,ind,root;
int head[MAXN],p[MAXN],v[MAXN];
int inq[MAXN],ouq[MAXN];
int ls[MAXN<<2],rs[MAXN<<2],maxv[MAXN<<2];
struct edge{
int next,to;
}e[MAXN];
void add_edge(int u,int v){
edge_cnt++;
e[edge_cnt].next=head[u];
head[u]=edge_cnt;
e[edge_cnt].to=v;
}
void refresh(int p){
maxv[p]=max(maxv[ls[p]],maxv[rs[p]]);
}
void dfs(int p,int fa){
inq[p]=++ind;
for(int i=head[p];i;i=e[i].next){
int v=e[i].to;
if(v!=fa){
dfs(v,p);
}
}
ouq[p]=++ind;
}
void modify(int &k,int l,int r,int pos,int val){
if(!k)k=++node_cnt;
if(l==r){
maxv[k]=val;
}
else{
int mid=(l+r)/2;
if(pos<=mid){
modify(ls[k],l,mid,pos,val);
}
else{
modify(rs[k],mid+1,r,pos,val);
}
}
refresh(k);
}
int query(int k,int cl,int cr,int l,int r){
// cout<<k<<' '<<cl<<' '<<cr<<' '<<l<<' '<<r<<endl;
if(!k)return -INF;
if(cl==l&&cr==r){
return maxv[k];
}
else{
int mid=(cl+cr)/2,ret=0;
if(r<=mid){
ret=query(ls[k],cl,mid,l,r);
}
else if(l>mid){
ret=query(rs[k],mid+1,cr,l,r);
}
else{
ret=max(query(ls[k],cl,mid,l,mid),query(rs[k],mid+1,cr,mid+1,r));
}
return ret;
}
}
signed main(){
n=read();
// maxv[0]=-INF;
for(int i=1;i<=n;i++){
p[i]=read(),v[i]=read();
add_edge(p[i],i);
}
dfs(1,0);
// dfs();
for(int i=1;i<=n;i++){
modify(root,1,ind,inq[i],v[i]);
}
m=read();
for(int i=1;i<=m;i++){
char op;
cin>>op;
int x=read();
if(op=='Q'){
int tmp=query(root,1,ind,inq[x],ouq[x]);
cout<<tmp<<endl;
if(tmp>v[x]){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
else{
v[x]=read();
modify(root,1,ind,inq[x],v[x]);
}
}
return 0;
}
//ACplease!!!