Submission #570472

#TimeUsernameProblemLanguageResultExecution timeMemory
5704728e7Fire (JOI20_ho_t5)C++17
100 / 100
578 ms69596 KiB
//Challenge: Accepted
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
#ifdef zisk
void debug(){cout << endl;}
template<class T, class ... U> void debug(T a, U ... b){cout << a << " ", debug(b...);}
template<class T> void pary(T l, T r) {
	while (l != r) cout << *l << " ", l++;
	cout << endl;
}
#else
#define debug(...) 0
#define pary(...) 0
#endif
#define ll long long
#define maxn 200005
#define mod 998244353
#define pii pair<int, int>
#define ff first
#define ss second
#define io ios_base::sync_with_stdio(0);cin.tie(0);
struct query{
	int l, r, id;	
	query(){l = r = id = 0;}
	query(int a, int b, int c){l = a, r = b, id = c;}
};
struct line{
	ll m, k;
	line(){m = k = 0;}
	line(ll x, ll y){m = x, k = y;}
	ll val(ll x){return m * x + k;}
	line operator +(line l){
		return line(m + l.m, k + l.k);
	}
};
struct segtree{
	line seg[4 * maxn];
	void init(int cur, int l, int r, ll a[]) {
		if (r <= l) return;
		if (r - l == 1) {
			seg[cur] = line{a[l], a[l]};
			return;	
		}
		int m = (l + r) / 2;
		init(cur*2, l, m, a), init(cur*2+1, m, r, a);
		seg[cur] = seg[cur*2] + seg[cur*2+1];
	}
	void modify(int cur, int l, int r, int ind, line li) {
		if (r <= l) return;
		if (r - l == 1) {
			seg[cur] = li;
			return;
		}
		int m = (l + r) / 2;
		if (ind < m) modify(cur*2, l, m, ind, li);
		else modify(cur*2+1, m, r, ind, li);
		seg[cur] = seg[cur*2] + seg[cur*2+1];
	}
	ll query(int cur, int l, int r, int ql, int qr, int x) {
		if (r <= l || ql >= r || qr <= l) return 0;
		if (ql <= l && qr >= r) return seg[cur].val(x);
		int m = (l + r) / 2;
		return query(cur*2, l, m, ql, qr, x) + query(cur*2+1, m, r, ql, qr, x);
	}
} tr;
struct sparse_table{
	pii sp[18][maxn];
	void build(int n, ll a[]) {
		for (int i = 1;i <= n;i++) sp[0][i] = {a[i], i};
		for (int i = 1;i < 18;i++) {
			for (int j = 1;j <= n - (1<<i) + 1;j++) {
				sp[i][j] = max(sp[i-1][j], sp[i-1][j + (1<<(i-1))]);
			}
		}
	}
	int query(int l, int r) { //[l, r]
		l = max(l, 1);
		int h = __lg(r - l + 1);
		return max(sp[h][l], sp[h][r - (1<<h) + 1]).ss;	
	}
} sp;
vector<query> que[maxn];
vector<int> ev[maxn];
ll a[maxn], ans[maxn];
int lef[maxn], rig[maxn], type[maxn];
int main() {
	io
	int n, q;
	cin >> n >> q;
	for (int i = 1;i <= n;i++) cin >> a[i];	
	for (int i = 0;i < q;i++) {
		int t, l, r;
		cin >> t >> l >> r;
		que[t].push_back(query(l, r, i));			
	}
	stack<int> stk;
	for (int i = 1;i <= n;i++) {
		while (stk.size() && a[i] >= a[stk.top()]) {
			rig[stk.top()] = i;	
			stk.pop();
		}
		if (stk.size()) lef[i] = stk.top();
		else lef[i] = -n;
		stk.push(i);
	}
	while (stk.size()) {
		rig[stk.top()] = n + 1;
		stk.pop();
	}
	for (int i = 1;i <= n;i++) {
		if (i - lef[i] - 1 < maxn) ev[i - lef[i] - 1].push_back(i);	
		if (rig[i] - i - 1 < maxn) ev[rig[i] - i - 1].push_back(i);	
		if (rig[i] - lef[i] < maxn) ev[rig[i] - lef[i]].push_back(i);
	}
	tr.init(1, 1, n+1, a);
	sp.build(n, a);
	for (int i = 0;i <= n;i++) {
		for (int j:ev[i]) {
			//debug("ch", j);
			if (type[j] < 2) {
				ll cur = tr.query(1, 1, n+1, j, j+1, i);
				tr.modify(1, 1, n+1, j, line(-type[j] * a[j], cur + type[j] * a[j] * i));
			} else {
				tr.modify(1, 1, n+1, j, line());		
			}
			type[j]++;
		}
		for (auto [l, r, id]:que[i]) {
			ans[id] = tr.query(1, 1, n+1, l - i, r+1, i);	
			debug(i, l, r);
			int mr = sp.query(r-i, r), ml = sp.query(l - i, l);
			debug(ans[id], ml, mr);
			ans[id] -= (min(rig[mr] - 1, mr + i) - r) * a[mr];
			ans[id] -= (l - max(lef[ml] + i + 1, ml)) * a[ml];
			ans[id] -= tr.query(1, 1, n+1, l - i, ml, i);
			ans[id] -= tr.query(1, 1, n+1, mr+1, r+1, i);
		}
	}
	for (int i = 0;i < q;i++) cout << ans[i] << "\n";
}
/*
10 1
3 1 4 1 5 9 2 6 5 3
3 2 8
*/

Compilation message (stderr)

ho_t5.cpp: In function 'int main()':
ho_t5.cpp:13:20: warning: statement has no effect [-Wunused-value]
   13 | #define debug(...) 0
      |                    ^
ho_t5.cpp:131:4: note: in expansion of macro 'debug'
  131 |    debug(i, l, r);
      |    ^~~~~
ho_t5.cpp:13:20: warning: statement has no effect [-Wunused-value]
   13 | #define debug(...) 0
      |                    ^
ho_t5.cpp:133:4: note: in expansion of macro 'debug'
  133 |    debug(ans[id], ml, mr);
      |    ^~~~~
#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...