Submission #799285

#TimeUsernameProblemLanguageResultExecution timeMemory
799285radaiosm7Stone Arranging 2 (JOI23_ho_t1)C++98
100 / 100
253 ms30116 KiB
#include <bits/stdc++.h>
using namespace std;
int n, m, i, x;
int seg[800020];
int ans[200005];
map<int, vector<int> > col;

void update(int from, int to, int l=1, int r=n, int indx=1) {
  if (from == l && to == r) {
    seg[indx] = x;
    return;
  }

  int mid = (l+r)/2;

  if (seg[indx] != 0) {
    seg[2*indx] = seg[indx];
    seg[2*indx+1] = seg[indx];
    seg[indx] = 0;
  }

  if (to <= mid) update(from, to, l, mid, 2*indx);
  else if (from > mid) update(from, to, mid+1, r, 2*indx+1);
  
  else {
    update(from, mid, l, mid, 2*indx);
    update(mid+1, to, mid+1, r, 2*indx+1);
  }
}

int query(int pos, int l=1, int r=n, int indx=1) {
  if (l == r) return seg[indx];
  int mid = (l+r)/2;

  if (seg[indx] != 0) {
    seg[2*indx] = seg[indx];
    seg[2*indx+1] = seg[indx];
    seg[indx] = 0;
  }

  if (pos <= mid) return query(pos, l, mid, 2*indx);
  else return query(pos, mid+1, r, 2*indx+1);
}

void build(int l=1, int r=n, int indx=1) {
  if (l == r) {
    ans[l] = seg[indx];
    return;
  }

  int mid = (l+r)/2;

  if (seg[indx] != 0) {
    seg[2*indx] = seg[indx];
    seg[2*indx+1] = seg[indx];
    seg[indx] = 0;
  }

  build(l, mid, 2*indx);
  build(mid+1, r, 2*indx+1);
}

int main() {
  scanf("%d", &n);
  fill(seg, seg+800015, 0);

  for (i=1; i <= n; ++i) {
    scanf("%d", &x);
    if (col.find(x) == col.end()) col[x] = {};
    while (!col[x].empty() && query(col[x].back()) != x) col[x].pop_back();
    if (!col[x].empty()) update(col[x].back(), i);
    else update(i, i);
    col[x].push_back(i);
  }

  build();
  for (i=1; i <= n; ++i) printf("%d\n", ans[i]);
  return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:64:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |   scanf("%d", &n);
      |   ~~~~~^~~~~~~~~~
Main.cpp:68:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |     scanf("%d", &x);
      |     ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...