제출 #167303

#제출 시각아이디문제언어결과실행 시간메모리
167303egekabasTenis (COI19_tenis)C++14
30 / 100
1059 ms12664 KiB
#include <bits/stdc++.h> #define ff first #define ss second #define pb push_back #define mp make_pair using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<ll, ll> pii; typedef pair<ull, ull> pull; typedef pair<ll, ll> pll; typedef pair<ld, ld> pld; struct player{ int a, b, c; }; player merge(player x, player y){ return {min(x.a, y.a), min(x.b, y.b), min(x.b, y.b)}; } int n, q; player ar[100009]; player seg1[400009]; player seg2[400009]; player seg3[400009]; void upd(int v, int tl, int tr, int idx, player val, player seg[]){ if(idx > tr || idx < tl) return; if(tl == idx && tr == idx){ seg[v] = val; return; } else{ int tm = (tl+tr)/2; upd(2*v, tl, tm, idx, val ,seg); upd(2*v+1, tm+1, tr, idx, val ,seg); seg[v] = merge(seg[2*v], seg[2*v+1]); } } player get(int v, int tl, int tr, int l, int r, player seg[]){ if(l > tr || r < tl) return {(int)1e9, (int)1e9, (int)1e9}; if(l <= tl && tr <= r){ return seg[v]; } else{ int tm = (tl+tr)/2; return merge(get(2*v, tl, tm, l, r ,seg), get(2*v+1, tm+1, tr, l, r ,seg)); } } player newopt(player a){ player ret = merge(get(1, 0, n-1, a.a, n-1, seg1), get(1, 0, n-1, a.b, n-1, seg2)); ret = merge(ret, get(1, 0, n-1, a.c, n-1, seg3)); return ret; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); cin >> n >> q; int t1; for(int i = 0; i < n; ++i){ cin >> t1; ar[t1].a = i; } for(int i = 0; i < n; ++i){ cin >> t1; ar[t1].b = i; } for(int i = 0; i < n; ++i){ cin >> t1; ar[t1].c = i; } for(int i = 1; i <= n; ++i){ upd(1, 0, n-1, ar[i].a, ar[i], seg1); upd(1, 0, n-1, ar[i].b, ar[i], seg2); upd(1, 0, n-1, ar[i].c, ar[i], seg3); } while(q--){ int t; cin >> t; if(t == 1){ int x; cin >> x; player cur = ar[x]; for(int i = 0; i < n-1; ++i){ player newcur = newopt(cur); if(cur.a == newcur.a && cur.b == newcur.b && cur.c == newcur.c) break; cur = newcur; } if(cur.a == 0 && cur.b == 0 && cur.c == 0) cout << "DA\n"; else cout << "NE\n"; } else{ int x, y, z; cin >> x >> y >> z; player &p1 = ar[y]; player &p2 = ar[z]; if(x == 1){ swap(p1.a, p2.a); } if(x == 2){ swap(p1.b, p2.b); } if(x == 3){ swap(p1.c, p2.c); } upd(1, 0, n-1, p1.a, p1, seg1); upd(1, 0, n-1, p1.b, p1, seg2); upd(1, 0, n-1, p1.c, p1, seg3); upd(1, 0, n-1, p2.a, p2, seg1); upd(1, 0, n-1, p2.b, p2, seg2); upd(1, 0, n-1, p2.c, p2, seg3); } } }
#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...