提交时间:2025-10-03 19:12:20
运行 ID: 38401
#include<bits/stdc++.h> using namespace std; long long n,m,q,s,op,lsa,mod; struct edge{long long v,w;}; vector<edge> g[500005]; vector<edge> t[500005]; long long c[500005]; long long ans[500005]; long long na[500005]; long long cnt[605];vector<long long>pos[605]; struct dot{ long long u,w; }; bool operator < (dot x,dot y){return x.w>y.w;} bool operator > (dot x,dot y){return x.w<y.w;} priority_queue<dot> pq; void diji(int s){ pq.push({s,0}); while(!pq.empty()){ long long u=pq.top().u,w=pq.top().w; pq.pop(); if(ans[u]!=-1)continue; ans[u]=w; for(auto v:g[u]){ if(ans[v.v]!=-1)continue; if(v.v==u)continue; pq.push({v.v,max(v.w,w)}); } } } int main(){ scanf("%d%d%d%d%d",&n,&m,&q,&s,&op); if(op==1) scanf("%lld",&mod); long long mxci=0; for(int i = 1;i<=n;i++){scanf("%d",&c[i]);mxci=max(mxci,c[i]);} while(m--){ int u,v,w; scanf("%d%d%d",&u,&v,&w); g[u].push_back({v,w}); g[v].push_back({u,w}); } memset(ans,-1,sizeof ans); diji(s); for(int i = 1;i<=n;i++){ na[c[i]]=1e9; } for(int i = 1;i<=n;i++){ na[c[i]]=min(ans[i],na[c[i]]); } while(q--){ long long l,r; scanf("%lld%lld",&l,&r); if(op==1){ l^=lsa,r^=lsa,l%=(mod),r%=(mod),l++,r++; } if(l>r)swap(l,r); long long cnt =0; for(int i = 1;i<=mxci;i++){ if(pos[i].empty())continue; if(na[i]<=r&&na[i]>=l)cnt +=r-na[i]+1; if(na[i]<l)cnt+=r-l+1; } printf("%lld\n",cnt); lsa=cnt; } }