提交时间:2025-10-03 18:59:02
运行 ID: 38394
#include<bits/stdc++.h> using namespace std; int n,m,q,s,opt; const int N=5e5+10; bool flagc[605]; long long minc[605]; long long c[N]; long long f[N]; long long vis[N]; long long M; long long lastans; struct wsw{ long long v,w; }; vector<wsw> Tree[N]; struct edge{ long long ui,vi,wi; }a[N]; bool cmp(edge x,edge y){ return x.wi<y.wi; } int find(long long x){ if(f[x]==x) return x; f[x]=find(f[x]); return f[x]; } void add(long long x,long long y){ f[find(x)]=y; } void dfs(long long x){ minc[c[x]]=min(minc[c[x]],vis[x]); for(int i=0;i<Tree[x].size();i++){ if(vis[Tree[x][i].v]==-1){ vis[Tree[x][i].v]=max(vis[x],(long long)Tree[x][i].w); dfs(Tree[x][i].v); } } return; } long long sum(long long x){ long long ans=0; for(int i=0;i<605;i++){ if(flagc[i]){ ans+=max((long long)0,(x-minc[i]+1)); } } return ans; } int main(){ for(long long i=0;i<605;i++){ minc[i]=1e9+5; } scanf("%lld%lld%lld%lld%lld",&n,&m,&q,&s,&opt); if(opt==1) scanf("%d",&M); for(long long i=1;i<=n;i++){ scanf("%lld",&c[i]); vis[i]=-1; flagc[c[i]]=1; f[i]=i; } for(long long i=1;i<=m;i++) scanf("%lld%lld%lld",&a[i].ui,&a[i].vi,&a[i].wi); sort(a+1,a+m+1,cmp); int dis=1; for(long long i=1;i<m;i++){ while(find(a[dis].ui)==find(a[dis].vi)&&dis<=m) dis++; add(a[dis].ui,a[dis].vi); Tree[a[dis].ui].push_back((wsw){a[dis].vi,a[dis].wi}); Tree[a[dis].vi].push_back((wsw){a[dis].ui,a[dis].wi}); } vis[s]=0; dfs(s); for(long long i=1;i<=q;i++){ long long li,ri; scanf("%lld%lld",&li,&ri); if(opt==1){ li=(li^lastans)%(M+1); ri=(li^lastans)%(M+1); } if(li>ri){ swap(li,ri); } lastans=sum(ri)-sum(li-1); printf("%lld\n",lastans); } return 0; }