Submission #705272

#TimeUsernameProblemLanguageResultExecution timeMemory
705272NursikTenis (COI19_tenis)C++14
100 / 100
150 ms7804 KiB
#include <iostream> #include <fstream> #include <iomanip> #include <vector> #include <set> #include <map> #include <cstring> #include <string> #include <cmath> #include <cassert> #include <ctime> #include <algorithm> #include <sstream> #include <list> #include <queue> #include <deque> #include <stack> #include <cstdlib> #include <cstdio> #include <iterator> #include <functional> #include <unordered_set> #include <unordered_map> #include <stdio.h> #include <bitset> #include <cstdint> #include <cassert> #include <functional> #include <complex> #include <random> using namespace std; #define ll long long #define pb push_back #define mp make_pair #define f first #define s second #define ld long double const ll maxn = 1e5 + 1, maxm = 3e5 + 1; const ll mod = 1e9 + 7, cmod = 998244353, inf = 1e9, blcok = 400, p2 = 31; const ld eps = 1e-9; int n, q; int a[5][maxn], pos[5][maxn]; struct seg_tree{ int t[maxn * 4], mv[maxn * 4]; void build(int v = 1, int tl = 1, int tr = n){ mv[v] = 0; if (tl == tr){ t[v] = tl; return; } int tm = (tl + tr) / 2; build(v + v, tl, tm); build(v + v + 1, tm + 1, tr); t[v] = min(t[v + v], t[v + v + 1]); } void push(int v, int l, int r){ if (mv[v]){ t[v] += mv[v]; if (l != r){ mv[v + v] += mv[v]; mv[v + v + 1] += mv[v]; } mv[v] = 0; } } void updlr(int l, int r, int val, int v = 1, int tl = 1, int tr = n){ push(v, tl, tr); // cout << v << " " << tl << " " << tr << '\n'; if (l <= tl && tr <= r){ mv[v] += val; push(v, tl, tr); return; } if (l > tr || r < tl) return; int tm = (tl + tr) / 2; updlr(l, r, val, v + v, tl, tm); updlr(l, r, val, v + v + 1, tm + 1, tr); t[v] = min(t[v + v], t[v + v + 1]); } int get(int v = 1, int tl = 1, int tr = n){ push(v, tl, tr); if (tl == tr) return tl; int tm = (tl + tr) / 2; push(v + v, tl, tm); push(v + v + 1, tm + 1, tr); if (t[v + v] == 0) return get(v + v, tl, tm); else return get(v + v + 1, tm + 1, tr); } } rt; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> q; for (int i = 1; i <= 3; ++i){ for (int j = 1; j <= n; ++j){ cin >> a[i][j]; pos[i][a[i][j]] = j; } } rt.build(); for (int i = 1; i <= n; ++i){ int x = max({pos[1][i], pos[2][i], pos[3][i]}); // cout << x << " " << n << '\n'; rt.updlr(x, n, -1); } // exit(0); for (int i = 1; i <= q; ++i){ int type; cin >> type; if (type == 1){ int x; cin >> x; int y = rt.get(); int z = max({pos[1][x], pos[2][x], pos[3][x]}); if (z <= y){ cout << "DA\n"; } else{ cout << "NE\n"; } } else{ int p, x, y, z; cin >> p >> x >> y; z = max({pos[1][x], pos[2][x], pos[3][x]}); rt.updlr(z, n, 1); z = max({pos[1][y], pos[2][y], pos[3][y]}); rt.updlr(z, n, 1); swap(pos[p][x], pos[p][y]); z = max({pos[1][x], pos[2][x], pos[3][x]}); rt.updlr(z, n, -1); z = max({pos[1][y], pos[2][y], pos[3][y]}); rt.updlr(z, n, -1); } } } /* */
#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...