提交时间:2025-10-03 16:34:17

运行 ID: 38384

#include<bits/stdc++.h> using namespace std; #define int long long #define ll long long #define pii pair<ll,ll> #define fr first #define sc second const int N=5e5+10; int n,m,q,s,opt,c[N],ct;ll M; pii ans[N],pre[N]; struct Edge{int u,v,w;}e[N]; bool cmp(Edge a,Edge b){return a.w<b.w;} int fa[N],sz[N];bool vis[N][510]; int find(int u){ if(fa[u]==u)return u; return fa[u]=find(fa[u]); } void merge(int x,int y){ x=find(x);y=find(y); if(x==y)return; if(sz[x]>sz[y]){ fa[y]=x;sz[x]+=sz[y]; for(int i=1;i<=500;i++)vis[x][i]|=vis[y][i]; } else{ fa[x]=y;sz[y]+=sz[x]; for(int i=1;i<=500;i++)vis[y][i]|=vis[x][i]; } } signed main(){ freopen("travel.in","r",stdin); freopen("travel.out","w",stdout); scanf("%lld%lld%lld",&n,&m,&q); scanf("%lld%lld",&s,&opt); if(opt==1)scanf("%lld",&M); for(int i=1;i<=n;i++)scanf("%lld",&c[i]); int u,v,w; for(int i=1;i<=m;i++){ scanf("%lld%lld%lld",&u,&v,&w); e[i]={u,v,w}; } sort(e+1,e+m+1,cmp); for(int i=1;i<=n;i++){ fa[i]=i;sz[i]=1;vis[i][c[i]]=1; } e[m+1].w=1e9+1;ans[0]={e[1].w-1,1};pre[0]={e[1].w-1,e[1].w-1}; // cout<<0<<" "<<e[1].w-1<<" "<<1<<" "<<e[1].w-1<<endl; // for(int i=1;i<=m;i++)cout<<e[i].w<<" ";cout<<endl; for(int i=1;i<=m;){ int x=e[i].w; while(e[i].w==x){ merge(e[i].u,e[i].v); // cout<<"??"<<e[i].u<<" "<<e[i].v<<endl; i++; } int rt=find(s),cnt=0; for(int j=1;j<=500;j++){ if(vis[rt][j])cnt++; } // cout<<cnt<<endl; ans[++ct]={e[i].w-1,cnt}; pre[ct]={e[i].w-1,pre[ct-1].sc+cnt*(e[i].w-e[i-1].w)}; // cout<<ct<<" "<<e[i].w-1<<" "<<cnt<<" "<<cnt*(e[i].w-e[i-1].w)<<endl; // cout<<i<<" "<<e[i].w-1<<" "<<cnt<<" "<<cnt*(e[i].w-e[i-1].w)<<endl; } int li,ri,lst=0;ll ANS=0; while(q--){ scanf("%lld%lld",&li,&ri); if(opt==1){li=(li^lst)%M+1;ri=(ri^lst)%M+1;} // cout<<li<<" "<<ri<<endl; if(li>ri)swap(li,ri); int l=0,r=ct,posl,posr; while(l<r){ int mid=(l+r)>>1; if(li>ans[mid].fr)l=mid+1; else r=mid; } posl=l; l=0;r=ct; while(l<r){ int mid=(l+r)>>1; if(ri>ans[mid].fr)l=mid+1; else r=mid; } posr=l; // cout<<"!"<<posl<<" "<<posr<<endl; if(posl!=posr){ ANS=pre[posr-1].sc-pre[posl].sc;//cout<<ANS<<endl; ANS+=(ans[posl].fr-li+1)*ans[posl].sc;//cout<<(ans[posl].fr-li+1)<<" "<<ans[posl].sc<<endl; ANS+=(ri-ans[posr-1].fr)*ans[posr].sc;//cout<<(ri-ans[posr-1].fr)<<" "<<ans[posr].sc<<endl; } else ANS=(ri-li+1)*ans[posl].sc; printf("%lld\n",ANS);lst=ANS; } fclose(stdin);fclose(stdout); return 0; }