제출 #871487

#제출 시각아이디문제언어결과실행 시간메모리
871487NeroZeinTenis (COI19_tenis)C++17
100 / 100
279 ms7964 KiB
#include "bits/stdc++.h"
using namespace std;

#ifdef Nero
#include "Deb.h"
#else
#define deb(...)
#endif

const int N = 1e5 + 5;

int lazy[N * 2], seg[N * 2];

void push(int nd, int l, int r) {
  if (!lazy[nd]) return;
  seg[nd] += lazy[nd];
  if (l != r) {
    int mid = (l + r) >> 1;
    int rs = nd + ((mid - l + 1) << 1);
    lazy[nd + 1] += lazy[nd];
    lazy[rs] += lazy[nd];
  }
  lazy[nd] = 0;
}

void upd(int nd, int l, int r, int s, int e, int v) {
  push(nd, l, r);
  if (l >= s && r <= e) {
    lazy[nd] = v;
    push(nd, l, r);
    return;
  }
  int mid = (l + r) >> 1;
  int rs = nd + ((mid - l + 1) << 1);
  if (mid >= e) {
    upd(nd + 1, l, mid, s, e, v); 
    push(rs, mid + 1, r); 
  } else {
    if (mid < s) {
      push(nd + 1, l, mid);
      upd(rs, mid + 1, r, s, e, v); 
    } else {
      upd(nd + 1, l, mid, s, e, v); 
      upd(rs, mid + 1, r, s, e, v);       
    }
  }
  seg[nd] = min(seg[nd + 1], seg[rs]); 
}

int get(int nd, int l, int r) {
  if (l == r) {
    return l;
  }
  int mid = (l + r) >> 1;
  int rs = nd + ((mid - l + 1) << 1);
  push(nd + 1, l, mid);
  push(rs, mid + 1, r);
  if (seg[nd + 1] == -1) {
    return get(nd + 1, l, mid);
  }
  return get(rs, mid + 1, r); 
}

int main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int n, q;
  cin >> n >> q;
  vector<vector<int>> a(3, vector<int> (n)); 
  vector<vector<int>> idx(3, vector<int> (n)); 
  for (int i = 0; i < 3; ++i) {
    for (int j = 0; j < n; ++j) {
      cin >> a[i][j];
      --a[i][j]; 
      idx[i][a[i][j]] = j; 
    }
  }
  auto get_first = [&](int x) {
    return min({idx[0][x], idx[1][x], idx[2][x]}); 
  };
  auto get_last = [&](int x) {
    return max({idx[0][x], idx[1][x], idx[2][x]}); 
  };
  auto fill = [&](int x, int y) {
    vector<int> ret;
    for (int i = 0; i < 3; ++i) {
      ret.push_back(idx[i][x]); 
      ret.push_back(idx[i][y]); 
    }
    sort(ret.begin(), ret.end());
    ret.resize(unique(ret.begin(), ret.end()) - ret.begin()); 
    return ret;
  };
  auto get_val = [&](int col) {
    return max({get_last(a[0][col]), get_last(a[1][col]), get_last(a[2][col])}); 
  };
  vector<int> b(n); 
  for (int i = 0; i < n; ++i) {
    b[i] = get_val(i); 
    upd(0, 0, n - 1, i, i, b[i]); 
    upd(0, 0, n - 1, get_last(i), n - 1, -1); 
  }
  while (q--) {
    int tp;
    cin >> tp;
    if (tp == 1) {
      int x;
      cin >> x;
      --x;
      int f = get_first(x);
      int c = get(0, 0, n - 1);
      cout << (c >= f ? "DA" : "NE") << '\n'; 
    } else {
      int p, x, y;
      cin >> p >> x >> y;
      --p, --x, --y;
      upd(0, 0, n - 1, get_last(x), n - 1, +1);
      upd(0, 0, n - 1, get_last(y), n - 1, +1);
      vector<int> cols = fill(x, y); 
      for (int i : cols) {
        upd(0, 0, n - 1, i, i, -b[i]); 
      }
      int px = idx[p][x];
      int py = idx[p][y];
      swap(idx[p][x], idx[p][y]); 
      a[p][px] = y;
      a[p][py] = x; 
      upd(0, 0, n - 1, get_last(x), n - 1, -1);
      upd(0, 0, n - 1, get_last(y), n - 1, -1);
      for (int i : cols) {
        b[i] = get_val(i); 
        upd(0, 0, n - 1, i, i, b[i]); 
      }
    }
  }
  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...