Submission #1261305

#TimeUsernameProblemLanguageResultExecution timeMemory
1261305minhpkBridges (APIO19_bridges)C++20
100 / 100
2211 ms16076 KiB
#include <bits/stdc++.h> using namespace std; int a,b; struct node{ int x,y,t; }; node z[100005]; set<pair<int,int>> s; int block=750; struct query{ int c,x,y; }; query q[100005]; bool cmp(pair<int,int> a,pair<int,int> b){ return a.second>b.second; } bool cmp1(node a,node b){ return a.y>b.y; } int res[100005]; int curpos=0; int id[100005]; struct dsu{ int par[100005]; int sz[100005]; vector<pair<int,int>> st; void init(){ for (int i=1;i<=a;i++){ par[i]=i; sz[i]=1; } st.clear(); } int find(int u){ if (par[u]==u) return u; return find(par[u]); } void join(int x,int y){ x=find(x); y=find(y); if (x==y){ st.push_back({-1,-1}); return; } if (sz[x]<sz[y]) swap(x,y); par[y]=x; sz[x]+=sz[y]; st.push_back({x,y}); } void rollback(){ auto pr=st.back(); st.pop_back(); int x=pr.first, y=pr.second; if (x==-1) return; sz[x]-=sz[y]; par[y]=y; } } d; int main(){ ios::sync_with_stdio(false); cin.tie(NULL); if (!(cin>>a>>b)) return 0; for (int i=1;i<=b;i++){ cin>>z[i].x>>z[i].y>>z[i].t; s.insert({i,z[i].t}); } int sadge; cin>>sadge; curpos=0; for (int i=1;i<=sadge;i++){ cin>>q[i].c>>q[i].x>>q[i].y; if (q[i].c==2){ curpos++; id[i]=curpos; } } for (int t=1;t<=sadge;t+=block){ int fin=min(sadge,t+block-1); set<pair<int,int>> s1; vector<node> pos; pos.reserve(fin-t+1); vector<vector<pair<int,int>>> preBlock(fin-t+1); for (int i=t;i<=fin;i++){ if (q[i].c==1){ auto it=s.lower_bound({q[i].x,INT_MIN}); if (it!=s.end() && it->first==q[i].x){ s1.insert(*it); s.erase(it); } } else { pos.push_back({q[i].x,q[i].y,i}); } } for (int i=t;i<=fin;i++){ if (q[i].c==1){ auto it=s1.lower_bound({q[i].x,INT_MIN}); if (it!=s1.end() && it->first==q[i].x) s1.erase(it); s1.insert({q[i].x,q[i].y}); } if (!s1.empty()){ for (auto &p:s1) preBlock[i-t].push_back(p); } } vector<pair<int,int>> z1; z1.reserve(s.size()); for (auto &p:s) z1.push_back(p); sort(z1.begin(),z1.end(),cmp); sort(pos.begin(),pos.end(),cmp1); int cur=0; d.init(); for (int i=0;i<(int)pos.size();i++){ int x=pos[i].x, y=pos[i].y, t1=pos[i].t; while (cur<(int)z1.size() && z1[cur].second>=y){ int uidx=z1[cur].first; d.join(z[uidx].x,z[uidx].y); cur++; } for (auto &p:preBlock[t1-t]){ if (p.second>=y){ int uidx=p.first; d.join(z[uidx].x,z[uidx].y); } } res[id[t1]]=d.sz[d.find(x)]; for (auto &p:preBlock[t1-t]){ if (p.second>=y) d.rollback(); } } for (auto &p:s1) s.insert(p); } for (int i=1;i<=curpos;i++) cout<<res[i]<<"\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...