提交时间:2022-10-12 17:03:01

运行 ID: 59455

#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=500005; int n,m,q,x,op,mod,c[MAXN],fa[MAXN],b[MAXN],t,ans[MAXN]; ll res[MAXN]; struct node { int u,v,w; bool operator<(const node b) const { return w<b.w; } } p[MAXN]; inline int Ffind(int x) { static int t,d; for(t=fa[x]; t^fa[t]; t=fa[t]); for(; x^fa[x]; d=fa[x],fa[x]=t,x=d); return t; } bitset<501>s[MAXN]; int main() { scanf("%d%d%d%d%d",&n,&m,&q,&x,&op); if(op==1) scanf("%d",&mod); for(int i=1; i<=n; ++i) scanf("%d",&c[i]),fa[i]=i,s[i][c[i]]=1; for(int i=1; i<=m; ++i) { scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].w); b[++t]=p[i].w; } sort(p+1,p+m+1),sort(b+1,b+t+1),t=unique(b+1,b+t+1)-b-1; b[++t]=2e9; for(int i=1; i<=m; ++i)p[i].w=lower_bound(b+1,b+t+1,p[i].w)-b; for(int i=1,j=1,u,v; i<=t; ++i) { for(; p[j].w==i&&j<=m; ++j) { u=Ffind(p[j].u),v=Ffind(p[j].v); if(u^v) { s[u]|=s[v]; fa[v]=u; } } ans[i]=s[Ffind(x)].count(); } ll lst=0; for(int i=1,l,r; i<=q; ++i) { scanf("%d%d",&l,&r); if(op==1) l=(l^lst)%mod+1,r=(r^lst)%mod+1; if(l>r)swap(l,r); lst=0; for(int j=l; j<=r; ++j) { lst+=ans[*lower_bound(b+1,b+t+1,j)==j?lower_bound(b+1,b+t+1,j)-b:lower_bound(b+1,b+t+1,j)-b-1]; } printf("%lld\n",lst); } return 0; }