제출 #1303935

#제출 시각아이디문제언어결과실행 시간메모리
1303935maxied비밀 (JOI14_secret)C++20
0 / 100
350 ms4448 KiB
#include "secret.h"
#include <bits/stdc++.h>
using namespace std;

//int Secret(int X, int Y);
vector<int> v;

template <typename T, typename F>
class DisjointSparseTable {
 public:
  int n;
  vector<vector<T>> mat;
  F func;

  DisjointSparseTable(const vector<T>& a, const F& f) : n(int(a.size())), func(f) {
    mat.push_back(a);
    for (int p = 1; (1 << p) < n; p++) {
      mat.emplace_back(n);
      for (int mid = 1 << p; mid < n; mid += 1 << (p + 1)) {
        mat[p][mid - 1] = a[mid - 1];
        for (int j = mid - 2; j >= mid - (1 << p); j--) {
          mat[p][j] = func(a[j], mat[p][j + 1]);
        }
        mat[p][mid] = a[mid];
        for (int j = mid + 1; j < min(n, mid + (1 << p)); j++) {
          mat[p][j] = func(mat[p][j - 1], a[j]);
        }
      }
    }
  }

  T Query(int l, int r) const {
    assert(0 <= l && l < r && r <= n);
    if (r - l == 1) {
      return mat[0][l];
    }
    int p = bit_width(unsigned(l ^ (r - 1))) - 1;
    return func(mat[p][l], mat[p][r - 1]);
  }
};

DisjointSparseTable<int,function<int(int,int)>> *table = nullptr;

void Init(int n, int a[]) {
	v.assign(n, 0);
	for (int i = 0; i < n; i++){
		v[i] = a[i];
	}
	table = new DisjointSparseTable(v, (function<int(int,int)>)[&](int a, int b) -> int{return Secret(a, b);});
}

int Query(int l, int r) {
	return table->Query(l, r);
}
#Verdict Execution timeMemoryGrader output
Fetching results...