Submission #1282291

#TimeUsernameProblemLanguageResultExecution timeMemory
1282291repmann벽 (IOI14_wall)C++20
100 / 100
535 ms59184 KiB
#include <bits/stdc++.h>
using namespace std;
int N, K, Q;
struct Node
{
  int l, r;
}ST[8000001];
inline void Setup()
{
  K = 1;
  while(K < N) K <<= 1;
  for(int i = 1; i <= (N + K - 1); i++) {ST[i].l = 0; ST[i].r = 0;}
  return;
}
inline void Merge(int i)
{
  ST[i].l = min(ST[i << 1].l, ST[i << 1 | 1].l);
  ST[i].r = max(ST[i << 1].r, ST[i << 1 | 1].r);
  return;
}
inline void Propagate(int i)
{
  if(i >= K) return;
  ST[i << 1].l = max(ST[i].l, ST[i << 1].l);
  ST[i << 1].r = min(ST[i].r, ST[i << 1].r);
  if(ST[i << 1].l > ST[i << 1].r)
  {
    if((ST[i].l <= ST[i << 1].l) && (ST[i << 1].l <= ST[i].r)) ST[i << 1].r = ST[i << 1].l;
    else ST[i << 1].l = ST[i << 1].r;
  }
  ST[i << 1 | 1].l = max(ST[i].l, ST[i << 1 | 1].l);
  ST[i << 1 | 1].r = min(ST[i].r, ST[i << 1 | 1].r);
  if(ST[i << 1 | 1].l > ST[i << 1 | 1].r)
  {
    if((ST[i].l <= ST[i << 1 | 1].l) && (ST[i << 1 | 1].l <= ST[i].r)) ST[i << 1 | 1].r = ST[i << 1 | 1].l;
    else ST[i << 1 | 1].l = ST[i << 1 | 1].r;
  }
  return;
}
inline void Finish()
{
  for(int i = 1; i < K; i++) Propagate(i);
  return;
}
inline void Update(int L, int R, int T, int X, int i = 1, int LC = 1, int RC = K)
{
  Propagate(i);
  if((LC > R) || (L > RC)) return;
  if((L <= LC) && (RC <= R))
  {
    if(T == 1) {ST[i].l = max(X, ST[i].l); ST[i].r = max(X, ST[i].r);}
    if(T == 2) {ST[i].l = min(X, ST[i].l); ST[i].r = min(X, ST[i].r);}
    Propagate(i);
    return;
  }
  int S = (LC + RC) >> 1;
  Update(L, R, T, X, i << 1, LC, S);
  Update(L, R, T, X, i << 1 | 1, S + 1, RC);
  Merge(i);
  return;
}
void buildWall(int n, int q, int t[], int l[], int r[], int x[], int O[])
{
  N = n;
  Q = q;
  Setup();
  for(int i = 0; i < Q; i++) Update(l[i] + 1, r[i] + 1, t[i], x[i]);
  Finish();
  for(int i = 0; i < N; i++) O[i] = ST[i + K].l;
  return;
}
//int main()
//{
//  int n, q;
//  cin >> n >> q;
//  int t[q], l[q], r[q], x[q], o[n];
//  for(int i = 0; i < q; i++) cin >> t[i] >> l[i] >> r[i] >> x[i];
//  buildWall(n, q, t, l, r, x, o);
//  for(int i = 0; i < n; i++) cout << o[i] << " \n"[i == (n - 1)];
//  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...