제출 #1261289

#제출 시각아이디문제언어결과실행 시간메모리
1261289minhpk다리 (APIO19_bridges)C++20
0 / 100
60 ms12216 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=320; struct query{ int c,x,y; }; query q[100005]; vector<pair<int,int>> pre[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; int id[100005]; struct dsu{ int par[100005]; int sz[100005]; stack<pair<int,int>> st; void init(){ for (int i=1;i<=a;i++){ par[i]=i; sz[i]=1; } while (st.size()){ st.pop(); } } 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({-1,-1}); return; } if (sz[x]<sz[y]){ swap(x,y); } par[y]=x; sz[x]+=sz[y]; st.push({x,y}); } void rollback(){ auto [x,y]=st.top(); st.pop(); if (x==-1){ return; } sz[x]-=sz[y]; par[y]=y; } }; dsu d; signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> a >> b; 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; 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,nigga=t;t<=min(sadge,nigga+block-1);t+=block){ set<pair<int,int>> s1; int fin=min(sadge,t+block-1); vector<node> pos; for (int i=t;i<=fin;i++){ if (q[i].c==1){ auto it=s.lower_bound({q[i].x,0LL}); if (it->first==q[i].x){ s1.insert(*it); s.erase(it); } }else{ pos.push_back({q[i].x,q[i].y,i}); } } sort(pos.begin(),pos.end(),cmp1); for (int i=t;i<=fin;i++){ if (q[i].c==1){ auto it=s1.lower_bound({q[i].x,0LL}); s1.erase(it); s1.insert({q[i].x,q[i].y}); } for (auto p:s1){ pre[i].push_back(p); } } vector <pair<int,int>> z1; for (auto p:s){ z1.push_back(p); } sort(z1.begin(),z1.end(),cmp); int cur=0; d.init(); for (int i=0;i<pos.size();i++){ auto [x,y,t1]=pos[i]; while (cur<z1.size() && z1[cur].second>=y){ auto [u,v]=z1[cur]; d.join(z[u].x,z[u].y); cur++; } for (auto p:pre[t1]){ if (p.second>=y){ d.join(z[p.first].x,z[p.first].y); } } res[id[t1]]=d.sz[d.find(x)]; for (auto p:pre[t1]){ if (p.second>=y){ d.rollback(); } } } for (auto p:s1){ s.insert(p); } s1.clear(); pos.clear(); z1.clear(); } 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...