Submission #225302

#TimeUsernameProblemLanguageResultExecution timeMemory
225302vioalbertPilot (NOI19_pilot)C++14
100 / 100
692 ms67872 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 1000005;
int n, q;
int h[N], y[N];

struct event {
	int ty, h, idx;
	bool operator<(const event& ot) {
		if(h == ot.h)
			return ty < ot.ty;
		return h < ot.h;
	}
};

ll cur;
ll ans[N];
vector<event> events;
int par[N], sz[N];

int find(int x) {
	if(par[x] == -1) return -1;
	if(par[x] == x) return x;
	else return par[x] = find(par[x]);
}

void join(int x, int y) {
	int parX = find(x);
	int parY = find(y);
	par[parX] = parY;
	sz[parY] = sz[parX] + sz[parY];
}

int main() {
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n >> q;
	for(int i = 0; i < n; i++) {
		cin >> h[i];
		events.push_back({0, h[i], i});
	}
	for(int i = 0; i < q; i++) {
		cin >> y[i];
		events.push_back({1, y[i], i});
	}

	for(int i = 0; i < n; i++) {
		par[i] = -1;
		sz[i] = 1;
	}

	sort(events.begin(), events.end());
	cur = 0;
	for(auto& e : events) {
		if(e.ty == 0) {
			par[e.idx] = e.idx;

			ll l = 0, r = 0;

			if(e.idx > 0 && par[e.idx-1] != -1) {
				l = sz[find(e.idx-1)];
				join(e.idx, e.idx-1);
			}

			if(e.idx < n-1 && par[e.idx+1] != -1) {
				r = sz[find(e.idx+1)];
				join(e.idx, e.idx+1);
			}

			cur += (l+1) * (r+1);
		} else {
			ans[e.idx] = cur;
		}
	}

	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...
#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...