Submission #667477

#TimeUsernameProblemLanguageResultExecution timeMemory
667477fatemetmhrJoker (BOI20_joker)C++17
100 / 100
290 ms14832 KiB
// ~ Be Name Khoda ~ // author: Fatemeh :/ #include<bits/stdc++.h> //#pragma GCC optimize("O3") using namespace std; typedef long long ll; #define pb push_back #define mp make_pair #define all(x) x.begin(), x.end() #define fi first #define se second const int maxn = 1e6 + 10; const int maxn5 = 5e5 + 10; const int maxnt = 1.2e6 + 10; const int maxn3 = 1e3 + 10; const int mod = 1e9 + 7; const ll inf = 1e18; struct posit{ bool oddcy; int v, u, paru, parv; posit(bool od, int vv, int uu, int pv, int pu){ oddcy = od; v = vv; u = uu; parv = pv; paru = pu; } }; vector <posit> av; bool ty[maxn5], oddcy = false; int par[maxn5], a[maxn5], b[maxn5], ans[maxn5]; pair<int, int> get_par(int v){ int x = 0; while(par[v] >= 0){ x ^= ty[v]; v = par[v]; } return {v, x}; } inline void add(int i){ pair<int, int> ver1 = get_par(a[i]), ver2 = get_par(b[i]); int v = ver1.fi, u = ver2.fi; if(u == v){ posit cur(oddcy, -1, -1, -1, -1); av.pb(cur); oddcy |= (ver1.se == ver2.se); return; } if(par[v] < par[u]) swap(u, v); posit cur(oddcy, v, u, par[v], par[u]); av.pb(cur); if(par[v] == par[u]) par[u]--; par[v] = u; ty[v] = (ver1.se ^ ver2.se ^ 1); return; } inline void undo(){ posit cur = av.back(); av.pop_back(); oddcy = cur.oddcy; if(cur.u == -1) return; par[cur.u] = cur.paru; par[cur.v] = cur.parv; return; } void solve(int l, int r, int optl, int optr){ if(r <= l || optr <= optl || optr <= l) return; int keepsize = av.size(); int mid = (l + r) >> 1; for(int i = l; i < mid; i++) add(i); int opt = mid - 1; if(oddcy){ opt = optr - 1; } else{ for(int i = optr - 1; i > max(mid, optl); i--){ add(i); if(oddcy){ opt = i - 1; break; } } } ans[mid] = opt; while(av.size() > keepsize) undo(); for(int i = optr - 1; i > opt; i--) add(i); solve(l, mid, optl, opt + 1); while(av.size() > keepsize) undo(); for(int i = l; i <= mid; i++) add(i); solve(mid + 1, r, opt, optr); while(av.size() > keepsize) undo(); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n, m, q; cin >> n >> m >> q; for(int i = 0; i < m; i++){ cin >> a[i] >> b[i]; a[i]--; b[i]--; ans[i] = i - 1; } memset(par, -1, sizeof par); solve(0, m, 0, m); for(int i = 0; i < q; i++){ int l, r; cin >> l >> r; l--; r--; cout << (ans[l] >= r ? "YES\n" : "NO\n"); } } /* Why so fast...? Hold on... Hold your breath... Need anything else? Nein, Kein Problem... Das Leben war schon immer so grausam :) */

Compilation message (stderr)

Joker.cpp: In function 'void solve(int, int, int, int)':
Joker.cpp:102:21: warning: comparison of integer expressions of different signedness: 'std::vector<posit>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  102 |     while(av.size() > keepsize)
      |           ~~~~~~~~~~^~~~~~~~~~
Joker.cpp:107:21: warning: comparison of integer expressions of different signedness: 'std::vector<posit>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  107 |     while(av.size() > keepsize)
      |           ~~~~~~~~~~^~~~~~~~~~
Joker.cpp:112:21: warning: comparison of integer expressions of different signedness: 'std::vector<posit>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  112 |     while(av.size() > keepsize)
      |           ~~~~~~~~~~^~~~~~~~~~
#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...