QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#542151 | #8939. Permutation | ucup-team180# | RE | 162ms | 3816kb | C++20 | 33.9kb | 2024-08-31 23:02:27 | 2024-08-31 23:02:28 |
Judging History
answer
#pragma region Macros
#ifdef noimi
#pragma comment(linker, "/stack:256000000")
#include "my_template.hpp"
#else
// #pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <immintrin.h>
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cfenv>
#include <cfloat>
#include <chrono>
#include <cinttypes>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdarg>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fstream>
#include <functional>
#include <immintrin.h>
#include <initializer_list>
#include <iomanip>
#include <ios>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <streambuf>
#include <string>
#include <tuple>
#include <type_traits>
#include <utility>
#include <variant>
#ifdef noimi
#define oj_local(a, b) b
#else
#define oj_local(a, b) a
#endif
#define LOCAL if(oj_local(0, 1))
#define OJ if(oj_local(1, 0))
using namespace std;
using ll = long long;
using ull = unsigned long long int;
using i128 = __int128_t;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using ld = long double;
template <typename T> using vc = vector<T>;
template <typename T> using vvc = vector<vc<T>>;
template <typename T> using vvvc = vector<vvc<T>>;
using vi = vc<int>;
using vl = vc<ll>;
using vpi = vc<pii>;
using vpl = vc<pll>;
template <class T> using pq = priority_queue<T>;
template <class T> using pqg = priority_queue<T, vector<T>, greater<T>>;
template <typename T> int si(const T &x) { return x.size(); }
template <class T, class S> inline bool chmax(T &a, const S &b) { return (a < b ? a = b, 1 : 0); }
template <class T, class S> inline bool chmin(T &a, const S &b) { return (a > b ? a = b, 1 : 0); }
vi iota(int n) {
vi a(n);
return iota(a.begin(), a.end(), 0), a;
}
template <typename T> vi iota(const vector<T> &a, bool greater = false) {
vi res(a.size());
iota(res.begin(), res.end(), 0);
sort(res.begin(), res.end(), [&](int i, int j) {
if(greater) return a[i] > a[j];
return a[i] < a[j];
});
return res;
}
// macros
#define overload5(a, b, c, d, e, name, ...) name
#define overload4(a, b, c, d, name, ...) name
#define endl '\n'
#define REP0(n) for(ll jidlsjf = 0; jidlsjf < n; ++jidlsjf)
#define REP1(i, n) for(ll i = 0; i < (n); ++i)
#define REP2(i, a, b) for(ll i = (a); i < (b); ++i)
#define REP3(i, a, b, c) for(ll i = (a); i < (b); i += (c))
#define rep(...) overload4(__VA_ARGS__, REP3, REP2, REP1, REP0)(__VA_ARGS__)
#define per0(n) for(int jidlsjf = 0; jidlsjf < (n); ++jidlsjf)
#define per1(i, n) for(ll i = (n) - 1; i >= 0; --i)
#define per2(i, a, b) for(ll i = (a) - 1; i >= b; --i)
#define per3(i, a, b, c) for(ll i = (a) - 1; i >= (b); i -= (c))
#define per(...) overload4(__VA_ARGS__, per3, per2, per1, per0)(__VA_ARGS__)
#define fore0(a) rep(a.size())
#define fore1(i, a) for(auto &&i : a)
#define fore2(a, b, v) for(auto &&[a, b] : v)
#define fore3(a, b, c, v) for(auto &&[a, b, c] : v)
#define fore4(a, b, c, d, v) for(auto &&[a, b, c, d] : v)
#define fore(...) overload5(__VA_ARGS__, fore4, fore3, fore2, fore1, fore0)(__VA_ARGS__)
#define setbits(j, n) for(ll iiiii = (n), j = lowbit(iiiii); iiiii; iiiii ^= 1 << j, j = lowbit(iiiii))
#define perm(v) for(bool permrepflag = true; (permrepflag ? exchange(permrepflag, false) : next_permutation(all(v)));)
#define fi first
#define se second
#define pb push_back
#define ppb pop_back
#define ppf pop_front
#define eb emplace_back
#define drop(s) cout << #s << endl, exit(0)
#define si(c) (int)(c).size()
#define lb(c, x) distance((c).begin(), lower_bound(all(c), (x)))
#define lbg(c, x) distance((c).begin(), lower_bound(all(c), (x), greater{}))
#define ub(c, x) distance((c).begin(), upper_bound(all(c), (x)))
#define ubg(c, x) distance((c).begin(), upper_bound(all(c), (x), greater{}))
#define rng(v, l, r) v.begin() + (l), v.begin() + (r)
#define all(c) begin(c), end(c)
#define rall(c) rbegin(c), rend(c)
#define SORT(v) sort(all(v))
#define REV(v) reverse(all(v))
#define UNIQUE(x) SORT(x), x.erase(unique(all(x)), x.end())
template <typename T = ll, typename S> T SUM(const S &v) { return accumulate(all(v), T(0)); }
#define MIN(v) *min_element(all(v))
#define MAX(v) *max_element(all(v))
#define overload2(_1, _2, name, ...) name
#define vec(type, name, ...) vector<type> name(__VA_ARGS__)
#define vv(type, name, h, ...) vector<vector<type>> name(h, vector<type>(__VA_ARGS__))
#define vvv(type, name, h, w, ...) vector<vector<vector<type>>> name(h, vector<vector<type>>(w, vector<type>(__VA_ARGS__)))
#define vvvv(type, name, a, b, c, ...) \
vector<vector<vector<vector<type>>>> name(a, vector<vector<vector<type>>>(b, vector<vector<type>>(c, vector<type>(__VA_ARGS__))))
constexpr pii dx4[4] = {pii{1, 0}, pii{0, 1}, pii{-1, 0}, pii{0, -1}};
constexpr pii dx8[8] = {{1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}};
namespace yesno_impl {
const string YESNO[2] = {"NO", "YES"};
const string YesNo[2] = {"No", "Yes"};
const string yesno[2] = {"no", "yes"};
const string firstsecond[2] = {"second", "first"};
const string FirstSecond[2] = {"Second", "First"};
const string possiblestr[2] = {"impossible", "possible"};
const string Possiblestr[2] = {"Impossible", "Possible"};
void YES(bool t = 1) { cout << YESNO[t] << endl; }
void NO(bool t = 1) { YES(!t); }
void Yes(bool t = 1) { cout << YesNo[t] << endl; }
void No(bool t = 1) { Yes(!t); }
void yes(bool t = 1) { cout << yesno[t] << endl; }
void no(bool t = 1) { yes(!t); }
void first(bool t = 1) { cout << firstsecond[t] << endl; }
void First(bool t = 1) { cout << FirstSecond[t] << endl; }
void possible(bool t = 1) { cout << possiblestr[t] << endl; }
void Possible(bool t = 1) { cout << Possiblestr[t] << endl; }
}; // namespace yesno_impl
using namespace yesno_impl;
#define INT(...) \
int __VA_ARGS__; \
IN(__VA_ARGS__)
#define INTd(...) \
int __VA_ARGS__; \
IN2(__VA_ARGS__)
#define LL(...) \
ll __VA_ARGS__; \
IN(__VA_ARGS__)
#define LLd(...) \
ll __VA_ARGS__; \
IN2(__VA_ARGS__)
#define STR(...) \
string __VA_ARGS__; \
IN(__VA_ARGS__)
#define CHR(...) \
char __VA_ARGS__; \
IN(__VA_ARGS__)
#define DBL(...) \
double __VA_ARGS__; \
IN(__VA_ARGS__)
#define VEC(type, name, size) \
vector<type> name(size); \
IN(name)
#define VECd(type, name, size) \
vector<type> name(size); \
IN2(name)
#define VEC2(type, name1, name2, size) \
vector<type> name1(size), name2(size); \
for(int i = 0; i < size; i++) IN(name1[i], name2[i])
#define VEC2d(type, name1, name2, size) \
vector<type> name1(size), name2(size); \
for(int i = 0; i < size; i++) IN2(name1[i], name2[i])
#define VEC3(type, name1, name2, name3, size) \
vector<type> name1(size), name2(size), name3(size); \
for(int i = 0; i < size; i++) IN(name1[i], name2[i], name3[i])
#define VEC3d(type, name1, name2, name3, size) \
vector<type> name1(size), name2(size), name3(size); \
for(int i = 0; i < size; i++) IN2(name1[i], name2[i], name3[i])
#define VEC4(type, name1, name2, name3, name4, size) \
vector<type> name1(size), name2(size), name3(size), name4(size); \
for(int i = 0; i < size; i++) IN(name1[i], name2[i], name3[i], name4[i]);
#define VEC4d(type, name1, name2, name3, name4, size) \
vector<type> name1(size), name2(size), name3(size), name4(size); \
for(int i = 0; i < size; i++) IN2(name1[i], name2[i], name3[i], name4[i]);
#define VV(type, name, h, w) \
vector<vector<type>> name(h, vector<type>(w)); \
IN(name)
#define VVd(type, name, h, w) \
vector<vector<type>> name(h, vector<type>(w)); \
IN2(name)
int scan() { return getchar(); }
void scan(int &a) { cin >> a; }
void scan(long long &a) { cin >> a; }
void scan(char &a) { cin >> a; }
void scan(double &a) { cin >> a; }
void scan(string &a) { cin >> a; }
template <class T, class S> void scan(pair<T, S> &p) { scan(p.first), scan(p.second); }
template <class T> void scan(vector<T> &);
template <class T> void scan(vector<T> &a) {
for(auto &i : a) scan(i);
}
template <class T> void scan(T &a) { cin >> a; }
void IN() {}
void IN2() {}
template <class Head, class... Tail> void IN(Head &head, Tail &...tail) {
scan(head);
IN(tail...);
}
template <class Head, class... Tail> void IN2(Head &head, Tail &...tail) {
scan(head);
--head;
IN2(tail...);
}
template <int p = -1> void pat() {}
template <int p = -1, class Head, class... Tail> void pat(Head &h, Tail &...tail) {
h += p;
pat<p>(tail...);
}
template <typename T, typename S> T ceil(T x, S y) {
assert(y);
return (y < 0 ? ceil(-x, -y) : (x > 0 ? (x + y - 1) / y : x / y));
}
template <typename T, typename S> T floor(T x, S y) {
assert(y);
return (y < 0 ? floor(-x, -y) : (x > 0 ? x / y : x / y - (x % y == 0 ? 0 : 1)));
}
template <typename T, typename S, typename U> U bigmul(const T &x, const S &y, const U &lim) { // clamp(x * y, -lim, lim)
if(x < 0 and y < 0) return bigmul(-x, -y, lim);
if(x < 0) return -bigmul(-x, y, lim);
if(y < 0) return -bigmul(x, -y, lim);
return y == 0 or x <= lim / y ? x * y : lim;
}
template <class T> T POW(T x, int n) {
T res = 1;
for(; n; n >>= 1, x *= x)
if(n & 1) res *= x;
return res;
}
template <class T, class S> T POW(T x, S n, const ll &mod) {
T res = 1;
x %= mod;
for(; n; n >>= 1, x = x * x % mod)
if(n & 1) res = res * x % mod;
return res;
}
vector<pll> factor(ll x) {
vector<pll> ans;
for(ll i = 2; i * i <= x; i++)
if(x % i == 0) {
ans.push_back({i, 1});
while((x /= i) % i == 0) ans.back().second++;
}
if(x != 1) ans.push_back({x, 1});
return ans;
}
template <class T> vector<T> divisor(T x) {
vector<T> ans;
for(T i = 1; i * i <= x; i++)
if(x % i == 0) {
ans.pb(i);
if(i * i != x) ans.pb(x / i);
}
return ans;
}
template <typename T> void zip(vector<T> &x) {
vector<T> y = x;
UNIQUE(y);
for(int i = 0; i < x.size(); ++i) { x[i] = lb(y, x[i]); }
}
template <class S> void fold_in(vector<S> &v) {}
template <typename Head, typename... Tail, class S> void fold_in(vector<S> &v, Head &&a, Tail &&...tail) {
for(auto e : a) v.emplace_back(e);
fold_in(v, tail...);
}
template <class S> void renumber(vector<S> &v) {}
template <typename Head, typename... Tail, class S> void renumber(vector<S> &v, Head &&a, Tail &&...tail) {
for(auto &&e : a) e = lb(v, e);
renumber(v, tail...);
}
template <class S, class... Args> vector<S> zip(vector<S> &head, Args &&...args) {
vector<S> v;
fold_in(v, head, args...);
sort(all(v)), v.erase(unique(all(v)), v.end());
renumber(v, head, args...);
return v;
}
template <typename S> void rearrange(const vector<S> &id) {}
template <typename S, typename T> void rearrange_exec(const vector<S> &id, vector<T> &v) {
vector<T> w(v.size());
rep(i, si(id)) w[i] = v[id[i]];
v.swap(w);
}
// 並び替える順番, 並び替える vector 達
template <typename S, typename Head, typename... Tail> void rearrange(const vector<S> &id, Head &a, Tail &...tail) {
rearrange_exec(id, a);
rearrange(id, tail...);
}
template <typename T> vector<T> RUI(const vector<T> &v) {
vector<T> res(v.size() + 1);
for(int i = 0; i < v.size(); i++) res[i + 1] = res[i] + v[i];
return res;
}
template <typename T> void zeta_supersetsum(vector<T> &f) {
int n = f.size();
for(int i = 1; i < n; i <<= 1) rep(b, n) if(!(i & b)) f[b] += f[b | i];
}
template <typename T> void zeta_subsetsum(vector<T> &f) {
int n = f.size();
for(int i = 1; i < n; i <<= 1) rep(b, n) if(!(i & b)) f[b | i] += f[b];
}
template <typename T> void mobius_subset(vector<T> &f) {
int n = f.size();
for(int i = 1; i < n; i <<= 1) rep(b, n) if(!(i & b)) f[b] -= f[b | i];
}
template <typename T> void mobius_superset(vector<T> &f) {
int n = f.size();
for(int i = 1; i < n; i <<= 1) rep(b, n) if(!(i & b)) f[b | i] -= f[b];
}
// 反時計周りに 90 度回転
template <typename T> void rot(vector<vector<T>> &v) {
if(empty(v)) return;
int n = v.size(), m = v[0].size();
vector<vector<T>> res(m, vector<T>(n));
rep(i, n) rep(j, m) res[m - 1 - j][i] = v[i][j];
v.swap(res);
}
vector<int> counter(const vector<int> &v, int max_num = -1) {
if(max_num == -1) max_num = MAX(v);
vector<int> res(max_num + 1);
fore(e, v) res[e]++;
return res;
}
// x in [l, r)
template <class T, class S> bool inc(const T &x, const S &l, const S &r) { return l <= x and x < r; }
template <class T, class S> bool inc(const T &x, const pair<S, S> &p) { return p.first <= x and x < p.second; }
// 便利関数
constexpr ll ten(int n) { return n == 0 ? 1 : ten(n - 1) * 10; }
constexpr ll tri(ll n) { return n * (n + 1) / 2; }
// l + ... + r
constexpr ll tri(ll l, ll r) { return (l + r) * (r - l + 1) / 2; }
ll max(int x, ll y) { return max((ll)x, y); }
ll max(ll x, int y) { return max(x, (ll)y); }
int min(int x, ll y) { return min((ll)x, y); }
int min(ll x, int y) { return min(x, (ll)y); }
// bit 演算系
#define bit(i) (1LL << i) // (1 << i)
#define test(b, i) (b >> i & 1) // b の i bit 目が立っているか
ll pow2(int i) { return 1LL << i; }
int topbit(signed t) { return t == 0 ? -1 : 31 - __builtin_clz(t); }
int topbit(ll t) { return t == 0 ? -1 : 63 - __builtin_clzll(t); }
// int lowbit(signed a) { return a == 0 ? 32 : __builtin_ctz(a); }
int lowbit(ull a) { return a == 0 ? 64 : __builtin_ctzll(a); }
// int allbit(int n) { return (1 << n) - 1; }
constexpr ll mask(int n) { return (1LL << n) - 1; }
// int popcount(signed t) { return __builtin_popcount(t); }
// int popcount(ll t) { return __builtin_popcountll(t); }
int popcount(uint64_t t) { return __builtin_popcountll(t); }
static inline uint64_t popcount64(uint64_t x) {
uint64_t m1 = 0x5555555555555555ll;
uint64_t m2 = 0x3333333333333333ll;
uint64_t m4 = 0x0F0F0F0F0F0F0F0Fll;
uint64_t h01 = 0x0101010101010101ll;
x -= (x >> 1) & m1;
x = (x & m2) + ((x >> 2) & m2);
x = (x + (x >> 4)) & m4;
return (x * h01) >> 56;
}
bool ispow2(int i) { return i && (i & -i) == i; }
ll rnd(ll l, ll r) { //[l, r)
#ifdef noimi
static mt19937_64 gen;
#else
static mt19937_64 gen(chrono::steady_clock::now().time_since_epoch().count());
#endif
return uniform_int_distribution<ll>(l, r - 1)(gen);
}
ll rnd(ll n) { return rnd(0, n); }
template <class t> void random_shuffle(vc<t> &a) { rep(i, si(a)) swap(a[i], a[rnd(0, i + 1)]); }
int in() {
int x;
cin >> x;
return x;
}
ll lin() {
unsigned long long x;
cin >> x;
return x;
}
template <class T, class S> pair<T, S> operator-(const pair<T, S> &x) { return pair<T, S>(-x.first, -x.second); }
template <class T, class S> pair<T, S> operator-(const pair<T, S> &x, const pair<T, S> &y) { return pair<T, S>(x.fi - y.fi, x.se - y.se); }
template <class T, class S> pair<T, S> operator+(const pair<T, S> &x, const pair<T, S> &y) { return pair<T, S>(x.fi + y.fi, x.se + y.se); }
template <class T> pair<T, T> operator&(const pair<T, T> &l, const pair<T, T> &r) { return pair<T, T>(max(l.fi, r.fi), min(l.se, r.se)); }
template <class T, class S> pair<T, S> operator+=(pair<T, S> &l, const pair<T, S> &r) { return l = l + r; }
template <class T, class S> pair<T, S> operator-=(pair<T, S> &l, const pair<T, S> &r) { return l = l - r; }
// 開閉
template <class T> bool intersect(const pair<T, T> &l, const pair<T, T> &r) { return (l.se < r.se ? r.fi < l.se : l.fi < r.se); }
template <class T> vector<T> &operator++(vector<T> &v) {
fore(e, v) e++;
return v;
}
template <class T> vector<T> operator++(vector<T> &v, int) {
auto res = v;
fore(e, v) e++;
return res;
}
template <class T> vector<T> &operator--(vector<T> &v) {
fore(e, v) e--;
return v;
}
template <class T> vector<T> operator--(vector<T> &v, int) {
auto res = v;
fore(e, v) e--;
return res;
}
template <class T> void connect(vector<T> &l, const vector<T> &r) { fore(e, r) l.eb(e); }
template <class T> vector<T> operator+(const vector<T> &l, const vector<T> &r) {
vector<T> res(max(si(l), si(r)));
rep(i, si(l)) res[i] += l[i];
rep(i, si(r)) res[i] += r[i];
return res;
}
template <class T> vector<T> operator-(const vector<T> &l, const vector<T> &r) {
vector<T> res(max(si(l), si(r)));
rep(i, si(l)) res[i] += l[i];
rep(i, si(r)) res[i] -= r[i];
return res;
}
template <class T> vector<T> &operator+=(const vector<T> &l, const vector<T> &r) {
if(si(l) < si(r)) l.resize(si(r));
rep(i, si(r)) l[i] += r[i];
return l;
}
template <class T> vector<T> &operator-=(const vector<T> &l, const vector<T> &r) {
if(si(l) < si(r)) l.resize(si(r));
rep(i, si(r)) l[i] -= r[i];
return l;
}
template <class T> vector<T> &operator+=(vector<T> &v, const T &x) {
fore(e, v) e += x;
return v;
}
template <class T> vector<T> &operator-=(vector<T> &v, const T &x) {
fore(e, v) e -= x;
return v;
}
template <typename T> struct edge {
int from, to;
T cost;
int id;
edge(int to, T cost) : from(-1), to(to), cost(cost) {}
edge(int from, int to, T cost) : from(from), to(to), cost(cost) {}
edge(int from, int to, T cost, int id) : from(from), to(to), cost(cost), id(id) {}
constexpr bool operator<(const edge<T> &rhs) const noexcept { return cost < rhs.cost; }
edge &operator=(const int &x) {
to = x;
return *this;
}
operator int() const { return to; }
friend ostream operator<<(ostream &os, const edge &e) { return os << e.to; }
};
template <typename T> using Edges = vector<edge<T>>;
template <typename T = int> Edges<T> read_edges(int m, bool weighted = false) {
Edges<T> res;
res.reserve(m);
for(int i = 0; i < m; i++) {
int u, v, c = 0;
scan(u), scan(v), u--, v--;
if(weighted) scan(c);
res.eb(u, v, c, i);
}
return res;
}
using Tree = vector<vector<int>>;
using Graph = vector<vector<int>>;
template <class T> using Wgraph = vector<vector<edge<T>>>;
Graph getG(int n, int m = -1, bool directed = false, int margin = 1) {
Tree res(n);
if(m == -1) m = n - 1;
while(m--) {
int a, b;
cin >> a >> b;
a -= margin, b -= margin;
res[a].emplace_back(b);
if(!directed) res[b].emplace_back(a);
}
return res;
}
Graph getTreeFromPar(int n, int margin = 1) {
Graph res(n);
for(int i = 1; i < n; i++) {
int a;
cin >> a;
res[a - margin].emplace_back(i);
}
return res;
}
template <class T> Wgraph<T> getWg(int n, int m = -1, bool directed = false, int margin = 1) {
Wgraph<T> res(n);
if(m == -1) m = n - 1;
while(m--) {
int a, b;
T c;
scan(a), scan(b), scan(c);
a -= margin, b -= margin;
res[a].emplace_back(b, c);
if(!directed) res[b].emplace_back(a, c);
}
return res;
}
void add(Graph &G, int x, int y) { G[x].eb(y), G[y].eb(x); }
template <class S, class T> void add(Wgraph<S> &G, int x, int y, T c) { G[x].eb(y, c), G[y].eb(x, c); }
#define TEST \
INT(testcases); \
while(testcases--)
i128 abs(const i128 &x) { return x > 0 ? x : -x; }
istream &operator>>(istream &is, i128 &v) {
string s;
is >> s;
v = 0;
for(int i = 0; i < (int)s.size(); i++) {
if(isdigit(s[i])) { v = v * 10 + s[i] - '0'; }
}
if(s[0] == '-') { v *= -1; }
return is;
}
ostream &operator<<(ostream &os, const i128 &v) {
if(v == 0) { return (os << "0"); }
i128 num = v;
if(v < 0) {
os << '-';
num = -num;
}
string s;
for(; num > 0; num /= 10) { s.push_back((char)(num % 10) + '0'); }
reverse(s.begin(), s.end());
return (os << s);
}
namespace aux {
template <typename T, unsigned N, unsigned L> struct tp {
static void output(std::ostream &os, const T &v) {
os << std::get<N>(v) << (&os == &cerr ? ", " : " ");
tp<T, N + 1, L>::output(os, v);
}
};
template <typename T, unsigned N> struct tp<T, N, N> {
static void output(std::ostream &os, const T &v) { os << std::get<N>(v); }
};
} // namespace aux
template <typename... Ts> std::ostream &operator<<(std::ostream &os, const std::tuple<Ts...> &t) {
if(&os == &cerr) { os << '('; }
aux::tp<std::tuple<Ts...>, 0, sizeof...(Ts) - 1>::output(os, t);
if(&os == &cerr) { os << ')'; }
return os;
}
template <typename T, typename S, typename U> std::ostream &operator<<(std::ostream &os, const priority_queue<T, S, U> &_pq) {
auto pq = _pq;
vector<T> res;
while(!empty(pq)) res.emplace_back(pq.top()), pq.pop();
return os << res;
}
template <class T, class S> ostream &operator<<(ostream &os, const pair<T, S> &p) {
if(&os == &cerr) { return os << "(" << p.first << ", " << p.second << ")"; }
return os << p.first << " " << p.second;
}
template <class Ch, class Tr, class Container> std::basic_ostream<Ch, Tr> &operator<<(std::basic_ostream<Ch, Tr> &os, const Container &x) {
bool f = true;
if(&os == &cerr) os << "[";
for(auto &y : x) {
if(&os == &cerr)
os << (f ? "" : ", ") << y;
else
os << (f ? "" : " ") << y;
f = false;
}
if(&os == &cerr) os << "]";
return os;
}
#define dump(...) static_cast<void>(0)
#define dbg(...) static_cast<void>(0)
void OUT() { cout << endl; }
template <class Head, class... Tail> void OUT(const Head &head, const Tail &...tail) {
cout << head;
if(sizeof...(tail)) cout << ' ';
OUT(tail...);
}
template <typename T> static constexpr T inf = numeric_limits<T>::max() / 2;
template <class T, class S> constexpr pair<T, S> inf<pair<T, S>> = {inf<T>, inf<S>};
template <class T> void OUT2(const T &t, T INF = inf<T>, T res = -1) { OUT(t != INF ? t : res); }
template <class T> void OUT2(vector<T> &v, T INF = inf<T>, T res = -1) {
fore(e, v) if(e == INF) e = res;
OUT(v);
fore(e, v) if(e == res) e = INF;
}
template <class F> struct REC {
F f;
REC(F &&f_) : f(forward<F>(f_)) {}
template <class... Args> auto operator()(Args &&...args) const { return f(*this, forward<Args>(args)...); }
};
template <class S> vector<pair<S, int>> runLength(const vector<S> &v) {
vector<pair<S, int>> res;
for(auto &e : v) {
if(res.empty() or res.back().fi != e)
res.eb(e, 1);
else
res.back().se++;
}
return res;
}
vector<pair<char, int>> runLength(const string &v) {
vector<pair<char, int>> res;
for(auto &e : v) {
if(res.empty() or res.back().fi != e)
res.eb(e, 1);
else
res.back().se++;
}
return res;
}
struct string_converter {
char start = 0;
char type(const char &c) const { return (islower(c) ? 'a' : isupper(c) ? 'A' : isdigit(c) ? '0' : 0); }
int convert(const char &c) {
if(!start) start = type(c);
return c - start;
}
int convert(const char &c, const string &chars) { return chars.find(c); }
template <typename T> auto convert(const T &v) {
vector<decltype(convert(v[0]))> ret;
ret.reserve(size(v));
for(auto &&e : v) ret.emplace_back(convert(e));
return ret;
}
template <typename T> auto convert(const T &v, const string &chars) {
vector<decltype(convert(v[0], chars))> ret;
ret.reserve(size(v));
for(auto &&e : v) ret.emplace_back(convert(e, chars));
return ret;
}
int operator()(const char &v, char s = 0) {
start = s;
return convert(v);
}
int operator()(const char &v, const string &chars) { return convert(v, chars); }
template <typename T> auto operator()(const T &v, char s = 0) {
start = s;
return convert(v);
}
template <typename T> auto operator()(const T &v, const string &chars) { return convert(v, chars); }
} toint;
template <class T, class F> T bin_search(T ok, T ng, const F &f) {
while(abs(ok - ng) > 1) {
T mid = ok + ng >> 1;
(f(mid) ? ok : ng) = mid;
}
return ok;
}
template <class T, class F> T bin_search_double(T ok, T ng, const F &f, int iter = 80) {
while(iter--) {
T mid = (ok + ng) / 2;
(f(mid) ? ok : ng) = mid;
}
return ok;
}
struct Setup_io {
Setup_io() {
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cout << fixed << setprecision(11);
}
} setup_io;
#endif
#pragma endregion
int main() {
TEST {
int n;
vi a;
LOCAL {
n = rnd(1, 100);
a = iota(n);
random_shuffle(a);
dump(n, a);
}
else { cin >> n; }
int c = 0;
int sum = 0;
auto ask = [&](int l, int r) {
if(r - l <= 1) return -1;
sum += r - l;
c++;
OUT("?", l + 1, r);
cout.flush();
LOCAL {
vpi v;
rep(i, l, r) v.eb(a[i], i);
SORT(v);
dump(v.end()[-2].se);
return v.end()[-2].se;
}
return in() - 1;
};
auto ans = [&](int i) {
dump(sum);
LOCAL {
assert(i == (max_element(all(a)) - begin(a)));
assert(c <= ceil(log2l(n) * 1.5));
assert(n * 3 >= sum);
}
else {
if(sum > n * 3) rep(inf<int>) OUT(1);
}
OUT("!", i + 1);
cout.flush();
};
REC([&](auto &&f, int l, int r, int k = -1) -> void {
dump(l, r, k);
if(r - l == 1) {
ans(l);
return;
}
if(k != -1) {
if(r - l == 2) {
ans(l ^ (l + 1) ^ k);
return;
}
int mid = l + r >> 1;
if(k < mid) {
if(ask(l, mid) == k)
f(l, mid, k);
else
f(mid, r);
} else {
if(ask(mid, r) == k)
f(mid, r, k);
else
f(l, mid);
}
return;
}
if(r - l == 2) {
ans(l ^ (l + 1) ^ ask(l, r));
} else if(r - l == 3) {
int x = ask(l, r);
if(x <= l + 1) {
if(x == ask(l, l + 2))
ans(l ^ (l + 1) ^ x);
else
ans(l + 2);
} else {
if(x == ask(l + 1, l + 3))
ans((l + 1) ^ (l + 2) ^ x);
else { ans(l); }
}
return;
} else {
vi v;
vi w;
rep(i, 4) w.eb((r - l + i) / 4);
v.eb(l);
SORT(w);
REV(w);
w.eb(w.front());
w.erase(begin(w));
fore(e, w) v.eb(v.back() + e);
auto g = [&](int i) {
rep(j, 1, si(v)) {
if(i < v[j]) return j - 1;
}
};
dump(v);
int x = ask(l, r);
int xp = g(x);
if(xp == 0) {
v = vi(rng(v, 0, 1));
SORT(w);
// REV(w);
fore(e, w) v.eb(v.back() + e);
int y = ask(v[0], v[2]);
if(x == y)
f(v[0], v[2], x);
else {
if(x == ask(v[0], v[3])) {
f(v[2], v[3]);
} else {
f(v[3], v[4]);
}
}
} else if(xp <= 2) {
if(ask(v[1], v[3]) == x) {
f(v[1], v[3], x);
} else {
if(x == ask(v[0], v[3])) {
f(v[0], v[1]);
} else {
f(v[3], v[4]);
}
}
} else {
SORT(w);
REV(w);
v.resize(1);
fore(e, w) v.eb(v.back() + e);
if(ask(v[2], v[4]) == x) {
f(v[2], v[4], x);
} else {
if(ask(v[1], v[4]) == x) {
f(v[1], v[2]);
} else {
f(v[0], v[1]);
}
}
}
}
})
(0, n);
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3648kb
input:
3 5 3 2 2 5 6 6 5 3 1 4 3 2 2
output:
? 1 5 ? 2 3 ? 1 3 ? 4 5 ! 4 ? 1 6 ? 5 6 ? 3 6 ? 1 2 ! 2 ? 1 4 ? 2 3 ? 1 3 ! 4
result:
ok Correct (3 test cases)
Test #2:
score: 0
Accepted
time: 82ms
memory: 3556kb
input:
10000 10 2 2 1 3 10 10 7 10 5 4 10 5 5 4 6 10 4 6 4 2 1 10 10 9 6 3 2 10 3 3 4 2 10 1 4 5 9 9 10 1 3 1 5 6 10 2 4 4 9 8 10 3 3 3 10 4 7 7 8 9 10 8 7 7 1 2 10 4 5 1 9 8 10 7 7 6 4 10 5 7 1 8 8 10 8 8 7 9 10 2 1 2 7 7 10 6 4 4 10 10 10 1 3 1 5 6 10 7 5 7 1 2 10 7 4 7 1 2 10 3 4 4 10 10 10 4 4 4 10 8 7...
output:
? 1 10 ? 1 4 ? 1 2 ? 3 4 ! 4 ? 1 10 ? 7 10 ? 4 10 ? 4 6 ? 4 5 ! 6 ? 1 10 ? 4 7 ? 4 5 ? 6 7 ! 7 ? 1 10 ? 4 7 ? 1 7 ? 1 3 ? 1 2 ! 3 ? 1 10 ? 7 10 ? 4 10 ? 1 3 ? 2 3 ! 1 ? 1 10 ? 1 4 ? 3 4 ? 1 2 ! 1 ? 1 10 ? 1 4 ? 1 7 ? 8 10 ? 8 9 ! 8 ? 1 10 ? 1 4 ? 1 7 ? 5 7 ? 5 6 ! 7 ? 1 10 ? 1 4 ? 1 7 ? 8 10 ? 8 9 !...
result:
ok Correct (10000 test cases)
Test #3:
score: 0
Accepted
time: 54ms
memory: 3816kb
input:
10000 3 1 2 11 5 5 4 8 7 2 2 19 3 4 3 13 14 12 11 7 5 5 4 3 3 3 19 6 10 6 1 2 1 2 2 15 11 11 11 10 8 14 1 1 3 5 5 16 4 4 1 8 7 8 3 3 2 19 13 6 13 5 4 5 2 2 4 1 2 3 7 2 2 3 3 2 2 17 1 1 2 8 7 6 14 9 9 9 9 20 9 9 6 13 13 6 4 3 2 5 18 7 7 7 6 9 8 8 6 8 3 8 6 6 5 3 16 10 10 10 10 6 1 2 1 3 10 3 4 3 6 6 ...
output:
? 1 3 ? 1 2 ! 3 ? 1 11 ? 4 8 ? 4 5 ? 6 8 ? 7 8 ! 6 ? 1 2 ! 1 ? 1 19 ? 1 9 ? 1 14 ? 10 14 ? 13 14 ? 12 14 ? 10 11 ! 10 ? 1 7 ? 3 5 ? 4 5 ! 3 ? 1 3 ? 2 3 ! 2 ? 1 19 ? 6 14 ? 1 14 ? 1 5 ? 1 2 ? 1 3 ! 3 ? 1 2 ! 1 ? 1 15 ? 5 11 ? 8 11 ? 10 11 ? 8 9 ! 9 ? 1 14 ? 1 6 ? 1 3 ? 4 6 ? 4 5 ! 4 ? 1 16 ? 1 8 ? 1 ...
result:
ok Correct (10000 test cases)
Test #4:
score: 0
Accepted
time: 88ms
memory: 3568kb
input:
10000 47 23 31 23 11 9 11 5 5 14 8 8 8 9 25 6 12 6 13 13 7 4 4 4 9 2 2 2 27 27 27 27 24 21 21 21 7 6 7 5 5 43 41 37 21 7 8 7 3 3 22 6 4 14 20 19 17 21 34 29 25 29 17 17 18 16 42 20 20 20 20 19 17 47 21 21 21 21 22 19 19 41 25 30 30 33 34 33 36 36 19 17 17 16 12 13 12 21 14 14 14 15 11 27 2 1 2 17 16...
output:
? 1 47 ? 13 35 ? 1 35 ? 1 12 ? 7 12 ? 4 12 ? 4 6 ? 4 5 ! 4 ? 1 14 ? 5 10 ? 8 10 ? 9 10 ! 10 ? 1 25 ? 1 12 ? 1 18 ? 13 18 ? 13 14 ! 14 ? 1 7 ? 3 5 ? 4 5 ! 5 ? 1 9 ? 1 4 ? 1 2 ! 1 ? 1 27 ? 15 27 ? 21 27 ? 24 27 ? 21 23 ? 21 22 ! 22 ? 1 21 ? 6 15 ? 1 15 ? 1 5 ? 4 5 ! 4 ? 1 43 ? 23 43 ? 12 43 ? 1 11 ? 4...
result:
ok Correct (10000 test cases)
Test #5:
score: 0
Accepted
time: 153ms
memory: 3608kb
input:
10000 100 47 47 48 61 68 68 71 72 71 69 9 2 2 1 4 53 46 35 15 6 6 6 7 33 3 16 16 31 31 30 32 82 60 60 42 29 36 29 23 24 24 26 88 39 39 25 59 59 59 59 60 71 24 29 29 59 59 59 60 61 92 52 45 45 88 88 88 89 91 91 24 11 9 11 5 6 5 3 66 51 51 66 45 45 43 39 40 39 92 43 50 43 20 20 20 20 19 48 1 1 1 5 9 1...
output:
? 1 100 ? 26 75 ? 26 50 ? 51 75 ? 57 68 ? 51 68 ? 69 75 ? 71 73 ? 69 73 ? 69 70 ! 70 ? 1 9 ? 1 4 ? 1 2 ? 3 4 ! 3 ? 1 53 ? 28 53 ? 15 53 ? 1 14 ? 5 10 ? 5 7 ? 6 7 ! 5 ? 1 33 ? 1 16 ? 1 24 ? 25 33 ? 30 33 ? 30 31 ? 32 33 ! 33 ? 1 82 ? 22 61 ? 42 61 ? 22 41 ? 27 36 ? 22 36 ? 22 26 ? 23 24 ? 22 24 ? 25 ...
result:
ok Correct (10000 test cases)
Test #6:
score: 0
Accepted
time: 99ms
memory: 3508kb
input:
10000 50 10 10 10 7 2 1 2 3 50 11 11 9 18 16 16 23 22 50 44 40 44 20 21 21 26 25 26 50 24 14 14 45 41 40 49 48 49 50 50 50 50 50 49 47 47 50 36 23 36 12 12 11 8 8 50 29 20 29 13 12 6 3 2 1 50 30 22 30 1 1 1 2 50 25 25 15 30 31 30 27 26 50 18 20 20 49 47 47 39 40 39 50 9 9 9 9 7 11 10 50 26 26 34 17 ...
output:
? 1 50 ? 1 24 ? 1 12 ? 7 12 ? 1 6 ? 1 2 ? 1 4 ? 3 4 ! 4 ? 1 50 ? 1 24 ? 1 12 ? 13 24 ? 16 21 ? 13 21 ? 22 24 ? 22 23 ! 24 ? 1 50 ? 27 50 ? 14 50 ? 14 26 ? 17 22 ? 14 22 ? 23 26 ? 25 26 ? 24 26 ! 24 ? 1 50 ? 14 37 ? 1 37 ? 38 50 ? 41 46 ? 38 46 ? 47 50 ? 48 49 ? 47 49 ! 47 ? 1 50 ? 27 50 ? 39 50 ? 45...
result:
ok Correct (10000 test cases)
Test #7:
score: 0
Accepted
time: 162ms
memory: 3576kb
input:
10000 100 76 78 35 5 5 3 9 9 100 29 66 29 20 20 20 22 24 23 100 64 38 38 88 88 90 86 87 87 83 100 51 57 57 98 92 92 79 78 77 81 100 44 75 44 13 13 17 12 11 11 7 100 64 64 62 41 41 41 42 40 39 100 93 56 93 40 32 32 44 44 45 100 37 37 33 57 60 54 74 75 75 70 100 76 76 76 76 80 86 87 86 85 100 32 32 32...
output:
? 1 100 ? 51 100 ? 26 100 ? 1 25 ? 1 12 ? 1 6 ? 7 12 ? 9 10 ! 10 ? 1 100 ? 26 75 ? 1 75 ? 1 25 ? 14 25 ? 20 25 ? 20 22 ? 23 25 ? 23 24 ! 25 ? 1 100 ? 26 75 ? 1 75 ? 76 100 ? 82 93 ? 88 93 ? 82 87 ? 86 87 ? 84 87 ? 82 83 ! 82 ? 1 100 ? 26 75 ? 1 75 ? 76 100 ? 89 100 ? 83 100 ? 76 82 ? 78 80 ? 76 80 ?...
result:
ok Correct (10000 test cases)
Test #8:
score: 0
Accepted
time: 14ms
memory: 3576kb
input:
1000 1000 475 728 728 896 896 929 867 867 869 858 860 860 847 848 847 1000 278 278 446 598 598 573 679 665 679 652 647 652 645 645 1000 75 128 75 607 644 644 713 732 695 749 745 749 742 741 742 1000 239 239 45 432 350 350 442 442 451 458 458 459 462 463 463 1000 978 978 978 978 997 914 902 882 932 9...
output:
? 1 1000 ? 251 750 ? 1 750 ? 751 1000 ? 814 937 ? 876 937 ? 814 875 ? 846 875 ? 861 875 ? 846 860 ? 854 860 ? 850 860 ? 846 849 ? 847 848 ? 846 848 ! 846 ? 1 1000 ? 251 750 ? 251 500 ? 501 750 ? 564 687 ? 564 625 ? 626 687 ? 658 687 ? 642 687 ? 642 657 ? 646 653 ? 642 653 ? 642 645 ? 644 645 ! 644 ?...
result:
ok Correct (1000 test cases)
Test #9:
score: 0
Accepted
time: 14ms
memory: 3628kb
input:
1017 272 246 186 246 111 110 111 73 73 73 73 114 105 91 91 2 2 2 2 3 910 173 173 173 127 14 14 28 56 56 51 44 45 47 48 726 229 517 229 118 63 118 28 28 28 28 27 24 861 315 315 344 491 551 551 632 641 614 593 593 594 597 596 1984 133 133 406 571 571 512 724 704 704 650 650 650 650 651 649 1145 988 98...
output:
? 1 272 ? 137 272 ? 69 272 ? 69 136 ? 86 119 ? 69 119 ? 69 85 ? 73 80 ? 73 76 ? 73 74 ! 74 ? 1 114 ? 59 114 ? 30 114 ? 1 29 ? 1 14 ? 1 7 ? 1 3 ? 2 3 ! 1 ? 1 910 ? 1 454 ? 1 227 ? 114 227 ? 1 113 ? 1 56 ? 1 28 ? 29 56 ? 43 56 ? 50 56 ? 43 49 ? 43 45 ? 43 47 ? 48 49 ! 49 ? 1 726 ? 183 544 ? 1 544 ? 1 ...
result:
ok Correct (1017 test cases)
Test #10:
score: 0
Accepted
time: 3ms
memory: 3620kb
input:
10 100000 3893 3893 3505 30673 33920 30673 43582 43582 43582 43582 43470 43242 43197 43046 43289 43298 43289 43268 43268 43268 43270 43273 43272 100000 32066 54928 54928 88585 88585 88585 89959 93282 93193 93193 90979 90917 90917 91257 91225 91257 91325 91339 91339 91348 91349 91348 91354 91353 1000...
output:
? 1 100000 ? 1 50000 ? 1 25000 ? 25001 50000 ? 25001 37500 ? 25001 43750 ? 37501 43750 ? 40627 43750 ? 42189 43750 ? 42970 43750 ? 43360 43750 ? 42970 43359 ? 43068 43261 ? 42970 43261 ? 43262 43359 ? 43287 43334 ? 43262 43334 ? 43262 43286 ? 43268 43279 ? 43268 43273 ? 43268 43270 ? 43271 43273 ? 4...
result:
ok Correct (10 test cases)
Test #11:
score: 0
Accepted
time: 3ms
memory: 3624kb
input:
21 84335 47947 60969 47947 9296 11772 1509 20931 19830 20931 17510 17606 17510 17352 17352 17352 17346 17316 17316 17308 17320 17320 17321 17323 159962 128177 145530 128177 54814 69184 54814 49869 48003 49869 43214 43214 43214 43231 43550 43608 43489 43675 43675 43670 43695 43695 43695 43696 43692 1...
output:
? 1 84335 ? 21085 63251 ? 1 63251 ? 1 21084 ? 5272 15813 ? 1 15813 ? 15814 21084 ? 18450 21084 ? 17132 21084 ? 17132 18449 ? 17462 18119 ? 17132 18119 ? 17132 17461 ? 17215 17378 ? 17297 17378 ? 17338 17378 ? 17297 17337 ? 17307 17326 ? 17307 17316 ? 17317 17326 ? 17320 17323 ? 17320 17321 ? 17322 1...
result:
ok Correct (21 test cases)
Test #12:
score: 0
Accepted
time: 1ms
memory: 3564kb
input:
1 1000000 641602 418256 169407 783270 783270 783270 783270 783270 786055 794273 791414 790964 796734 796734 796734 796734 796686 796850 796850 796850 796851 796864 796864 796866 796861 796861
output:
? 1 1000000 ? 250001 750000 ? 1 750000 ? 750001 1000000 ? 750001 875000 ? 750001 812500 ? 781251 812500 ? 781251 796875 ? 781251 789062 ? 789063 796875 ? 791016 794921 ? 789063 794921 ? 794922 796875 ? 795900 796875 ? 796388 796875 ? 796632 796875 ? 796632 796753 ? 796754 796875 ? 796816 796875 ? 79...
result:
ok Correct (1 test case)
Test #13:
score: 0
Accepted
time: 0ms
memory: 3816kb
input:
16 232936 229707 229707 229707 229707 229707 231039 223556 220604 218882 224031 224548 224548 225261 225261 225290 225375 225395 225323 225407 225417 225417 225425 225425 225426 225423 8676 6498 6498 6498 5867 4978 4978 5022 4731 4731 4731 4717 4684 4692 4684 4699 4697 4699 4695 221085 172303 209705...
output:
? 1 232936 ? 116469 232936 ? 174703 232936 ? 203820 232936 ? 218378 232936 ? 225657 232936 ? 218378 225656 ? 220198 223836 ? 218378 223836 ? 223837 225656 ? 223837 224746 ? 223837 225201 ? 225202 225656 ? 225202 225428 ? 225202 225314 ? 225315 225428 ? 225344 225399 ? 225315 225399 ? 225400 225428 ?...
result:
ok Correct (16 test cases)
Test #14:
score: 0
Accepted
time: 28ms
memory: 3676kb
input:
1994 667 666 667 667 167 166 166 42 41 41 11 10 10 3 2 374 373 374 374 94 93 93 24 23 23 6 5 5 2 488 486 488 488 122 121 121 31 30 30 8 7 7 2 922 921 922 922 231 230 230 58 57 57 15 14 14 4 3 3 639 637 639 639 160 159 159 40 39 39 10 9 9 3 2 353 350 353 353 89 88 88 23 22 22 6 5 5 2 71 66 71 71 18 1...
output:
? 1 667 ? 335 667 ? 168 667 ? 1 167 ? 85 167 ? 43 167 ? 1 42 ? 23 42 ? 12 42 ? 1 11 ? 7 11 ? 4 11 ? 1 3 ? 2 3 ! 1 ? 1 374 ? 189 374 ? 95 374 ? 1 94 ? 49 94 ? 25 94 ? 1 24 ? 13 24 ? 7 24 ? 1 6 ? 5 6 ? 3 6 ? 1 2 ! 1 ? 1 488 ? 245 488 ? 123 488 ? 1 122 ? 63 122 ? 32 122 ? 1 31 ? 17 31 ? 9 31 ? 1 8 ? 5 ...
result:
ok Correct (1994 test cases)
Test #15:
score: -100
Runtime Error
input:
18 153667 153667 153666 153666 38417 38416 38416 9605 9604 9604 2402 2401 2401 601 600 600 151 150 150 38 37 37 10 9 9 3 2 211376 211374 211376 211376 52844 52843 52843 13211 13210 13210 3303 3302 3302 826 825 825 207 206 206 52 51 51 13 12 12 4 3 3 195330 195326 195330 195330 48833 48832 48832 1220...
output:
? 1 153667 ? 76835 153667 ? 38418 153667 ? 1 38417 ? 19210 38417 ? 9606 38417 ? 1 9605 ? 4804 9605 ? 2403 9605 ? 1 2402 ? 1203 2402 ? 602 2402 ? 1 601 ? 302 601 ? 152 601 ? 1 151 ? 77 151 ? 39 151 ? 1 38 ? 21 38 ? 11 38 ? 1 10 ? 7 10 ? 4 10 ? 1 3 ? 2 3 ! 1 ? 1 211376 ? 105689 211376 ? 52845 211376 ?...