Submission #557084

#TimeUsernameProblemLanguageResultExecution timeMemory
557084lunchbox역사적 조사 (JOI14_historical)C++17
100 / 100
737 ms8636 KiB
/*
https://oj.uz/problem/view/JOI14_historical
역사적 조사 (Historical)
*/
#include <bits/stdc++.h>
using namespace std;

using LL = long long;
const int N = 100000, B = 350, Q = 100000;

vector<array<int, 3>> qq[(N - 1) / B + 1];

int kk[N], aa_[N];
stack<pair<LL, int>> stk;

void add(int a) {
	kk[a]++;
	stk.push({max(stk.top().first, (LL) kk[a] * aa_[a]), a});
}
void pop() {
	kk[stk.top().second]--;
	stk.pop();
}
LL best() {
	return stk.top().first;
}

void run() {
	static LL ans[Q];
	static int aa[N];
	vector<int> vv;
	int n, q;

	scanf("%d%d", &n, &q);
	for (int i = 0; i < n; i++) {
		scanf("%d", &aa[i]);
		vv.push_back(aa[i]);
	}
	sort(vv.begin(), vv.end());
	vv.erase(unique(vv.begin(), vv.end()), vv.end());
	for (int i = 0; i < n; i++) {
		int v = aa[i];

		aa[i] = lower_bound(vv.begin(), vv.end(), aa[i]) - vv.begin();
		aa_[aa[i]] = v;
	}
	for (int i = 0; i < q; i++) {
		int l, r;

		scanf("%d%d", &l, &r), l--, r--;
		qq[l / B].push_back({r, l, i});
	}
	stk.push({0, -1});
	for (int b = 0; b <= (n - 1) / B; b++) {
		int r_ = min(n, (b + 1) * B), p = r_ - 1;

		sort(qq[b].begin(), qq[b].end());
		for (auto [r, l, i] : qq[b]) {
			if (r < r_) {
				for (int j = l; j <= r; j++)
					add(aa[j]);
				ans[i] = best();
				for (int j = l; j <= r; j++)
					pop();
			} else {
				while (p < r)
					add(aa[++p]);
				for (int j = l; j < r_; j++)
					add(aa[j]);
				ans[i] = best();
				for (int j = l; j < r_; j++)
					pop();
			}
		}
		while (stk.size() > 1)
			pop();
	}
	for (int i = 0; i < q; i++)
		printf("%lld\n", ans[i]);
}

int main() {
	run();
	return 0;
}

Compilation message (stderr)

historic.cpp: In function 'void run()':
historic.cpp:34:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   34 |  scanf("%d%d", &n, &q);
      |  ~~~~~^~~~~~~~~~~~~~~~
historic.cpp:36:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   36 |   scanf("%d", &aa[i]);
      |   ~~~~~^~~~~~~~~~~~~~
historic.cpp:50:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |   scanf("%d%d", &l, &r), l--, r--;
      |   ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...