1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include <bits/stdc++.h> #define int long long #define lid (id<<1) #define rid (id<<1|1) #define mid ((tr[id].l+tr[id].r)>>1) using namespace std; int n,m,top=2e5,L[200005],R[200005],fa[200005],dep[200005],tp,teg[200005]; struct tree{ int l,r; vector<pair<int,int> > e; }tr[800005]; void build(int id,int l,int r){ tr[id].l=l,tr[id].r=r; if(l==r)return; build(lid,l,mid),build(rid,mid+1,r); } void modify(int id,int l,int r,int u,int v){ if(tr[id].l==l&&tr[id].r==r){ tr[id].e.push_back(make_pair(u,v)); return; } if(r<=mid)modify(lid,l,r,u,v); else if(l>mid)modify(rid,l,r,u,v); else modify(lid,l,mid,u,v),modify(rid,mid+1,r,u,v); } int find(int x){ if(x==fa[x])return x; return find(fa[x]); } struct node{ int u,v,su,sv; }stk[400005]; void merge(int u,int v){ if(find(u)==find(v))return; u=find(u),v=find(v); if(dep[u]>dep[v])swap(u,v); stk[++tp]=node{u,v,dep[u],dep[v]}; teg[u]-=teg[v],fa[u]=v,dep[v]+=dep[u]==dep[v]; } void redo(node k){ fa[k.u]=k.u,dep[k.v]=k.sv;teg[k.u]+=teg[k.v]; } void dfs(int id){ int pre=tp; for(int i=0;i<tr[id].e.size();i++){ merge(tr[id].e[i].first,tr[id].e[i].second); } if(tr[id].l==tr[id].r)teg[find(1)]++; else dfs(lid),dfs(rid); while(tp!=pre)redo(stk[tp--]); } signed main(){ cin>>n>>m;build(1,1,top); for(int i=1;i<=n;i++)scanf("%lld%lld",&L[i],&R[i]); for(int i=1;i<=m;i++){ int u,v;scanf("%lld%lld",&u,&v); int ll=max(L[u],L[v]),rr=min(R[u],R[v]); if(ll<=rr)modify(1,ll,rr,u,v); } for(int i=1;i<=n;i++)fa[i]=i; dfs(1); for(int i=1;i<=n;i++){ if(teg[i])cout<<i<<' '; } return 0; }
|