Submission #1261302

#TimeUsernameProblemLanguageResultExecution timeMemory
1261302minhpkBridges (APIO19_bridges)C++20
13 / 100
1659 ms589824 KiB
#include <bits/stdc++.h>

using namespace std;
int a,b;
struct node{
     int x,y,t;
};
node z[50005];
set<pair<int,int>> s;
int block=750;
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;t<=min(sadge,t+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});
              }
             if (s1.size()){
                 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();
                   }
              }
         }
        if (s1.size()){
            for (auto p:s1){
              s.insert(p);
            }  
        }
        for (int i=t;i<=fin;i++){
             pre[i].clear();
        } 
         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...