求能hack掉我这个代码的数据,虽然我不知道样例是怎么过的。
#include<bits/stdc++.h>
using namespace std;
const int N=200005;
const int INF=1e9;
int n,m;
struct edge{
int to,nxt,w;
}e[N<<1];
int head[N],cur;
void add_edge(int u,int v,int w){
e[++cur].to=v;
e[cur].nxt=head[u];
e[cur].w=w;
head[u]=cur;
}
struct tree{
struct segtree{
int mx[N<<2],mx_sec[N<<2],mn[N<<2],mn_sec[N<<2],mx_cnt[N<<2],mn_cnt[N<<2];
int sum[N<<2],si[N<<2],lazy_add[N<<2],lazy_max[N<<2],lazy_min[N<<2];
void pushup(int p){
sum[p]=sum[p*2]+sum[p*2+1];
si[p]=si[p*2]+si[p*2+1];
if(mx[p*2]==mx[p*2+1]){
mx[p]=mx[p*2];
mx_sec[p]=max(mx_sec[p*2],mx_sec[p*2+1]);
mx_cnt[p]=mx_cnt[p*2]+mx_cnt[p*2+1];
}
else if(mx[p*2]>mx[p*2+1]){
mx[p]=mx[p*2];
mx_cnt[p]=mx_cnt[p*2];
mx_sec[p]=max(mx[p*2+1],mx_sec[p*2]);
}
else {
mx[p]=mx[p*2+1];
mx_sec[p]=max(mx[p*2],mx_sec[p*2+1]);
mx_cnt[p]=mx_cnt[p*2+1];
}//mx
if(mn[p*2]==mn[p*2+1]){
mn[p]=mn[p*2];
mn_sec[p]=min(mn_sec[p*2],mn_sec[p*2+1]);
mn_cnt[p]=mn_cnt[p*2]+mn_cnt[p*2+1];
}
else if(mn[p*2]<mn[p*2+1]){
mn[p]=mn[p*2];
mn_sec[p]=min(mn_sec[p*2],mn[p*2+1]);
mn_cnt[p]=mn_cnt[p*2];
}
else {
mn[p]=mn[p*2+1];
mn_sec[p]=min(mn_sec[p*2+1],mn[p*2]);
mn_cnt[p]=mn_cnt[p*2+1];
}//mn
}
void a_lazy_add(int p,int v){
lazy_add[p]+=v;
sum[p]+=v*si[p];
mx[p]+=v;
mn[p]+=v;
if(mx_sec[p]!=-INF)mx_sec[p]+=v;
if(mn_sec[p]!=INF)mn_sec[p]+=v;
if(lazy_max[p]!=-INF)lazy_max[p]+=v;
if(lazy_min[p]!=INF)lazy_min[p]+=v;
}
void a_lazy_max(int p,int v){
if(mn[p]>v)return ;
sum[p]+=(v-mn[p])*mn_cnt[p];
if(mx_sec[p]==mn[p])mx_sec[p]=v;
if(mx[p]==mn[p])mx[p]=v;
if(lazy_min[p]<v)lazy_min[p]=v;
mn[p]=lazy_max[p]=v;
}
void a_lazy_min(int p,int v){
if(mx[p]<=v)return ;
sum[p]+=(v-mx[p])*mx_cnt[p];
if(mn_sec[p]==mx[p])mn_sec[p]=v;
if(mn[p]==mx[p])mn[p]=v;
if(lazy_max[p]>v)lazy_max[p]=v;
mx[p]=lazy_min[p]=v;
}
void push_down_add(int p){
if(lazy_add[p]==0)return ;
a_lazy_add(p*2,lazy_add[p]);
a_lazy_add(p*2+1,lazy_add[p]);
lazy_add[p]=0;
}
void push_down_max(int p){
if(lazy_max[p]==-INF)return ;
a_lazy_max(p*2,lazy_max[p]);
a_lazy_max(p*2+1,lazy_max[p]);
lazy_max[p]=-INF;
}
void push_down_min(int p){
if(lazy_min[p]==INF)return ;
a_lazy_min(p*2,lazy_min[p]);
a_lazy_min(p*2+1,lazy_min[p]);
lazy_min[p]=INF;
}
void push_down(int p){
push_down_add(p);
push_down_min(p);
push_down_max(p);
}
void add_sum(int p,int l,int r,int x,int y,int v){
if(l>=x&&r<=y){
a_lazy_add(p,v);
return ;
}
int mid=(l+r)>>1;
push_down(p);
if(mid>=x)add_sum(p*2,l,mid,x,y,v);
if(mid<y)add_sum(p*2+1,mid+1,r,x,y,v);
pushup(p);
}
void build(int p,int l,int r){
lazy_max[p]=-INF;
lazy_min[p]=INF;
if(l==r){
mx[p]=mn[p]=sum[p]=INF;
mx_sec[p]=-INF;
mn_sec[p]=INF;
mx_cnt[p]=mn_cnt[p]=1;
si[p]=1;
return ;
}
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
pushup(p);
}
void add_max(int p,int l,int r,int x,int y,int v){
if(mn[p]>=v)return ;
if(l>=x&&r<=y&&mn_sec[p]>v){
a_lazy_max(p,v);
return ;
}
push_down(p);
int mid=(l+r)>>1;
if(mid>=x)add_max(p*2,l,mid,x,y,v);
if(mid<y)add_max(p*2+1,mid+1,r,x,y,v);
pushup(p);
}
void add_min(int p,int l,int r,int x,int y,int v){
if(mx[p]<=v)return ;
if(l>=x&&r<=y&&mx_sec[p]<v){
a_lazy_min(p,v);
return ;
}
int mid=(l+r)>>1;
push_down(p);
if(mid>=x)add_min(p*2,l,mid,x,y,v);
if(mid<y)add_min(p*2+1,mid+1,r,x,y,v);
pushup(p);
}
int query_sum(int p,int l,int r,int x,int y){
if(l>=x&&r<=y)return sum[p];
int mid=(l+r)>>1,ans=0;
push_down(p);
if(mid>=x)ans+=query_sum(p*2,l,mid,x,y);
if(mid<y)ans+=query_sum(p*2+1,mid+1,r,x,y);
return ans;
}
int query_mx(int p,int l,int r,int x,int y){
if(l>=x&&r<=y)return mx[p];
int mid=(l+r)>>1,ans=-INF;
push_down(p);
if(mid>=x)ans=max(ans,query_mx(p*2,l,mid,x,y));
if(mid<y)ans=max(ans,query_mx(p*2+1,mid+1,r,x,y));
return ans;
}
int query_mn(int p,int l,int r,int x,int y){
if(l>=x&&r<=y)return mn[p];
int mid=(l+r)>>1,ans=INF;
push_down(p);
if(mid>=x)ans=min(ans,query_mn(p*2,l,mid,x,y));
if(mid<y)ans=min(ans,query_mn(p*2+1,mid+1,r,x,y));
return ans;
}
}st;
int son[N],dfn[N],rnk[N],dep[N],fa[N],siz[N],top[N],cnt;
void dfs1(int u,int ft){
siz[u]=1;
son[u]=-1;
dep[u]=dep[ft]+1;
fa[u]=ft;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==ft)continue;
dfs1(v,u);
siz[u]+=siz[v];
if(son[u]==-1||siz[v]>siz[son[u]])son[u]=v;
}
}
void dfs2(int u,int tp){
top[u]=tp;
cnt++;
dfn[u]=cnt;
rnk[cnt]=u;
if(son[u]!=-1)dfs2(son[u],tp);
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==son[u]||v==fa[u])continue;
dfs2(v,v);
}
}
void add(int x,int y,int v){
int fx=top[x],fy=top[y];
while(fx!=fy){
if(dep[fx]>=dep[fy])st.add_min(1,1,n,dfn[fx],dfn[x],v),x=fa[fx];
else st.add_min(1,1,n,dfn[fy],dfn[y],v),y=fa[fy];
fx=top[x];
fy=top[y];
}
if(dfn[x]<dfn[y])st.add_min(1,1,n,dfn[x]+1,dfn[y],v);
else st.add_min(1,1,n,dfn[y]+1,dfn[x],v);
}
int query(int u,int v){
int lca=max(dfn[u],dfn[v]);
return st.query_mn(1,1,n,lca,lca);
}
}s1;
struct LCA{
int fa[N][25],mx[N][25],dep[N];
void dfs(int u,int ft){
dep[u]=dep[ft]+1;
fa[u][0]=ft;
for(int i=1;i<=20;i++){
fa[u][i]=fa[fa[u][i-1]][i-1];
mx[u][i]=max(mx[u][i-1],mx[fa[u][i-1]][i-1]);
}
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(v==ft)continue;
mx[v][0]=w;
dfs(v,u);
}
}
int get_lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=20;i>=0;i--)
if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
if(x==y)return x;
for(int i=20;i>=0;i--)
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
return fa[x][0];
}
int get_mx(int x,int y){
int lca=get_lca(x,y);
int ans=0;
for(int i=20;i>=0;i--){
if(dep[fa[x][i]]>=dep[lca])ans=max(ans,mx[x][i]),x=fa[x][i];
if(dep[fa[y][i]]>=dep[lca])ans=max(ans,mx[y][i]),y=fa[y][i];
}
return ans;
}
}s2;
struct node{
int u,v,w,id;
}in[N],a[N];
bool used[N];
bool cmp(node a,node b){
return a.w<b.w;
}
int fa[N];
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
bool merge(int x,int y){
int p=find(x),q=find(y);
if(p==q)return 0;
fa[p]=q;
return 1;
}
void krukstra(){
for(int i=1;i<=n;i++)fa[i]=i;
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++){
if(!merge(a[i].u,a[i].v))continue;
add_edge(a[i].u,a[i].v,a[i].w);
add_edge(a[i].v,a[i].u,a[i].w);
used[a[i].id]=1;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>in[i].u>>in[i].v>>in[i].w;
a[i].u=in[i].u;
a[i].v=in[i].v;
a[i].w=in[i].w;
a[i].id=i;
}
krukstra();
s1.dfs1(1,0);
s1.dfs2(1,1);
s1.st.build(1,1,n);
s2.dfs(1,0);
for(int i=1;i<=m;i++){
if(used[i])continue;
int u=in[i].u,v=in[i].v,w=in[i].w;
s1.add(u,v,w);
}
int q;
cin>>q;
while(q--){
int i,s,t;
cin>>i>>s>>t;
if(!used[i]){
cout<<"0\n";
continue;
}
int u=in[i].u,v=in[i].v,w=in[i].w;
int ft=s2.get_lca(s,t);
if((s2.get_lca(u,s)==ft||s2.get_lca(u,t)==ft)&&(s2.get_lca(v,s)==ft||s2.get_lca(v,t)==ft)){
int mx=s2.get_mx(s,t);
int tmp=s1.query(u,v);
if(w<mx){
cout<<"0\n";
continue;
}
cout<<min(1,tmp-w)<<"\n";
continue;
}
cout<<"0\n";
}
return 0;
}