Submission #1272863

#TimeUsernameProblemLanguageResultExecution timeMemory
1272863goulthenPilot (NOI19_pilot)C++20
100 / 100
399 ms69812 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define per(i,a,b) for(int i = a; i >= b; i--)
#define pii pair<int,int>
#define pb push_back
#define fi first
#define se second

const int MAXN = 1e6+10;
const int INF = 1e18+10;
int a[MAXN], lf[MAXN], rg[MAXN], ans[MAXN];

int32_t main() {
	ios_base::sync_with_stdio(0); cin.tie(nullptr);
	int n,q;cin >> n >> q;
	vector<pii> vals;
	rep(i,1,n) {
		cin >> a[i];
		vals.pb({a[i],i});
	}

	stack<int> stk;
	a[0] = INF, a[n+1] = INF;
	stk.push(0);
	rep(i,1,n) {
		while (a[i] > a[stk.top()]) stk.pop();
		lf[i] = stk.top();
		stk.push(i);
	}
	while (!stk.empty())stk.pop();
	stk.push(n+1);
	per(i,n,1) {
		while (a[i] >= a[stk.top()]) stk.pop();
		rg[i] = stk.top();
		stk.push(i);
	}

	vector<pii> qr;
	rep(i,1,q) {
		int x;cin >> x;
		qr.push_back({x,i});
	}
	sort(qr.begin(), qr.end(), greater<pii>());
	sort(vals.begin(), vals.end(),greater<pii>());

	int id = 0, anss = 0;
	for (auto &[x,i] : qr) {
		while (id < n && vals[id].fi > x) {
			int j = vals[id].se;
			anss+= (rg[j]-j)*(j-lf[j]);
			id++;
		}

		ans[i] = n*(n+1)/2 - anss;
	}

	rep(i,1,q) 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...