Submission #478195

#TimeUsernameProblemLanguageResultExecution timeMemory
478195FatihSolakMostovi (COI14_mostovi)C++17
100 / 100
387 ms11508 KiB
#include <bits/stdc++.h> #define N 200005 using namespace std; int n; set<int> del[2]; set<pair<int,int>> bridge[2]; bool can(int x,int y,int type){ if(x > n){ return can(2*n+1-x,2*n+1-y,!type); } if(y <= n){ if(x <= y && y <= *del[type].lower_bound(x))return 1; if(y <= x && bridge[type].size() && bridge[type].lower_bound({y+1,0}) != bridge[type].begin()){ if(can(x,prev(bridge[type].lower_bound({y+1,0}))->second,type) && can(prev(bridge[type].lower_bound({y+1,0}))->first,y,type))return 1; } } else{ if(!(bridge[type].empty() || bridge[type].rbegin()->first < x || bridge[type].rbegin()->second < y)){ int l = x,r = bridge[type].rbegin()->first; while(l < r){ int m = (l + r)/2; auto it = bridge[type].lower_bound({m,0}); if(it->second < y){ l = m+1; } else r = m; } auto it = bridge[type].lower_bound({l,0}); if(can(x,it->first,type)&&can(it->second,y,type))return 1; } } return 0; } void solve(){ int m; cin >> n >> m; del[0].insert(2*n+5); del[1].insert(2*n+5); while(m--){ char type; int x,y; cin >> type >> x >> y; if(type == 'A'){ if(y < x)swap(x,y); bridge[0].insert({x,y}); bridge[1].insert({2*n+1 -y,2*n+1-x}); } if(type == 'B'){ if(y < x)swap(x,y); del[0].insert(x); del[1].insert(2*n+1-y); } if(type == 'Q'){ cout << (can(x,y,0)?"DA":"NE") << "\n"; } } } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); #ifdef Local freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif int t=1; //cin>>t; while(t--){ solve(); } #ifdef Local cout<<endl<<fixed<<setprecision(2)<<1000.0 * clock() / CLOCKS_PER_SEC<< " milliseconds "; #endif }
#Verdict Execution timeMemoryGrader output
Fetching results...