提交时间:2025-10-03 18:38:54

运行 ID: 38387

#include<bits/stdc++.h> using namespace std; int n,m,q,s,opt; bool flagc[605]; long long minc[605]; int c[500005]; int f[500005]; long long vis[500005]; long long M; long long lastans; struct wsw{ int v,w; }; vector<wsw> Tree[500005]; struct edge{ int ui,vi,wi; }a[500005]; bool cmp(edge x,edge y){ return x.wi<y.wi; } int find(int x){ if(f[x]==x) return x; f[x]=find(f[x]); return f[x]; } void add(int x,int y){ f[find(x)]=y; } void dfs(int 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(int 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(int i=0;i<605;i++){ minc[i]=1e9+5; } cin>>n>>m>>q>>s>>opt; if(opt==1) cin>>M; for(int i=1;i<=n;i++){ cin>>c[i]; vis[i]=-1; flagc[c[i]]=1; f[i]=i; } for(int i=1;i<=m;i++) cin>>a[i].ui>>a[i].vi>>a[i].wi; sort(a+1,a+m+1,cmp); int dis=1; for(int i=1;i<m;i++){ while(find(a[dis].ui)==find(a[dis].vi)) 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(int i=1;i<=q;i++){ int li,ri; cin>>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); cout<<lastans<<endl; } return 0; }