Submission #789723

#TimeUsernameProblemLanguageResultExecution timeMemory
789723IBory역사적 조사 (JOI14_historical)C++17
5 / 100
30 ms2524 KiB
#include <bits/stdc++.h> #define pii pair<ll, ll> typedef long long ll; using namespace std; const int MAX = 123456, SQ = 8; ll X[MAX], ans[MAX], cnt[MAX], S[MAX]; priority_queue<ll> PQ[MAX >> 8], E[MAX >> 8]; struct Query { int s, e, id; Query(int a = 0, int b = 0, int c = 0) { s = a, e = b, id = c; } const bool operator<(Query& a) { if ((s >> SQ) != (a.s >> SQ)) return (s >> SQ) < (a.s >> SQ); return e > a.e; } } QS[MAX]; void Add(int idx) { int n = S[idx]; priority_queue<ll>& C = PQ[n >> SQ]; priority_queue<ll>& EPQ = E[n >> SQ]; if (cnt[n]) EPQ.push(X[n] * cnt[n]); C.push(X[n] * (++cnt[n])); } void Sub(int idx) { int n = S[idx]; priority_queue<ll>& C = PQ[n >> SQ]; priority_queue<ll>& EPQ = E[n >> SQ]; EPQ.push(X[n] * cnt[n]); if (--cnt[n]) C.push(X[n] * (cnt[n])); } int main() { ios::sync_with_stdio(0); cin.tie(0); int N, Q; cin >> N >> Q; map<int, int> occur; for (int i = 1; i <= N; ++i) { cin >> X[i]; if (occur.find(X[i]) == occur.end()) S[i] = occur[X[i]] = i; else S[i] = occur[X[i]]; } for (int i = 0; i < Q; ++i) { int s, e; cin >> s >> e; QS[i] = Query(s, e, i); } sort(QS, QS + Q); int L = 1, R = 0; for (int i = 0; i < Q; ++i) { auto [s, e, id] = QS[i]; while (R < e) Add(++R); while (s < L) Add(--L); while (e < R) Sub(R--); while (L < s) Sub(L++); for (int i = 0; i < (MAX >> SQ); ++i) { if (PQ[i].empty()) continue; while (!E[i].empty() && PQ[i].top() == E[i].top()) PQ[i].pop(), E[i].pop(); ans[id] = max(ans[id], PQ[i].top()); } } for (int i = 0; i < Q; ++i) cout << ans[i] << '\n'; 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...