This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <stdio.h>
#define N	300000
#define N_	(1 << 19)	/* N_ = pow2(ceil(log2(N))) */
int sgn(long long a) { return a == 0 ? 0 : (a < 0 ? -1 : 1); }
int h_, n_;
int aa_[N_ * 2]; long long bb_[N_ * 2];
void put(int i, int a, long long b) {
	aa_[i] *= a, bb_[i] = bb_[i] * a + b;
}
void pus(int i) {
	if (aa_[i] != 1 || bb_[i] != 0)
		put(i << 1 | 0, aa_[i], bb_[i]), put(i << 1 | 1, aa_[i], bb_[i]), aa_[i] = 1, bb_[i] = 0;
}
void push(int i) {
	int h;
	for (h = h_; h > 0; h--)
		pus(i >> h);
}
int sz[N_ * 2], pppos[N_ * 2], ppneg[N_ * 2], qqpos[N_ * 2], qqneg[N_ * 2]; long long st[N_ * 2]; char lz[N_];
void put_(int i) {
	int tmp;
	tmp = pppos[i], pppos[i] = ppneg[i], ppneg[i] = tmp;
	tmp = qqpos[i], qqpos[i] = qqneg[i], qqneg[i] = tmp;
	if (i < n_)
		lz[i] ^= 1;
}
void pus_(int i) {
	if (lz[i])
		put_(i << 1 | 0), put_(i << 1 | 1), lz[i] = 0;
}
void pul_(int i) {
	if (!lz[i]) {
		int l = i << 1, r = l | 1;
		pppos[i] = pppos[l] < sz[l] ? pppos[l] : sz[l] + pppos[r];
		ppneg[i] = ppneg[l] < sz[l] ? ppneg[l] : sz[l] + ppneg[r];
		qqpos[i] = qqpos[r] < sz[r] ? qqpos[r] : qqpos[l] + sz[r];
		qqneg[i] = qqneg[r] < sz[r] ? qqneg[r] : qqneg[l] + sz[r];
		st[i] = st[l] + st[r] + (long long) qqpos[l] * pppos[r] + (long long) qqneg[l] * ppneg[r];
	}
}
void push_(int i) {
	int h;
	for (h = h_; h > 0; h--)
		pus_(i >> h);
}
void pull_(int i) {
	while (i > 1)
		pul_(i >>= 1);
}
void build(int *aa, int n) {
	int i, x;
	h_ = 0;
	while (1 << h_ < n)
		h_++;
	n_ = 1 << h_;
	for (i = 0; i < n_; i++)
		aa_[i] = 1, bb_[i] = 0;
	for (i = 0; i < n_; i++)
		aa_[n_ + i] = 0, bb_[n_ + i] = i < n ? aa[i] : 0;
	for (i = 0; i < n_; i++) {
		sz[n_ + i] = 1;
		x = i + 1 < n ? sgn(aa[i + 1] - aa[i]) * (i % 2 == 0 ? 1 : -1) : 0;
		if (x == 1)
			pppos[n_ + i] = 1, ppneg[n_ + i] = 0, qqpos[n_ + i] = 1, qqneg[n_ + i] = 0, st[n_ + i] = 1;
		else if (x == -1)
			pppos[n_ + i] = 0, ppneg[n_ + i] = 1, qqpos[n_ + i] = 0, qqneg[n_ + i] = 1, st[n_ + i] = 1;
		else
			pppos[n_ + i] = 0, ppneg[n_ + i] = 0, qqpos[n_ + i] = 0, qqneg[n_ + i] = 0, st[n_ + i] = 0;
	}
	for (i = n_ - 1; i > 0; i--)
		sz[i] = sz[i << 1 | 0] + sz[i << 1 | 1], pul_(i);
}
void update(int l, int r, int a, long long b) {
	push(l += n_), push(r += n_);
	for ( ; l <= r; l >>= 1, r >>= 1) {
		if ((l & 1) == 1)
			put(l++, a, b);
		if ((r & 1) == 0)
			put(r--, a, b);
	}
}
long long query(int i) {
	push(i += n_);
	return bb_[i];
}
void upd_(int i, int x) {
	i += n_;
	push_(i);
	if (x == 1)
		pppos[i] = 1, ppneg[i] = 0, qqpos[i] = 1, qqneg[i] = 0, st[i] = 1;
	else if (x == -1)
		pppos[i] = 0, ppneg[i] = 1, qqpos[i] = 0, qqneg[i] = 1, st[i] = 1;
	else
		pppos[i] = 0, ppneg[i] = 0, qqpos[i] = 0, qqneg[i] = 0, st[i] = 0;
	pull_(i);
}
void update_(int l, int r) {
	int l_, r_;
	if (l > r)
		return;
	l_ = l += n_, r_ = r += n_;
	push_(l_), push_(r_);
	for ( ; l <= r; l >>= 1, r >>= 1) {
		if ((l & 1) == 1)
			put_(l++);
		if ((r & 1) == 0)
			put_(r--);
	}
	pull_(l_), pull_(r_);
}
long long query_(int l, int r) {
	int qpos, qneg, ppos, pneg;
	long long x;
	if (l > r)
		return 0;
	push_(l += n_), push_(r += n_);
	qpos = 0, qneg = 0, ppos = 0, pneg = 0, x = 0;
	for ( ; l <= r; l >>= 1, r >>= 1) {
		if ((l & 1) == 1) {
			x += st[l] + (long long) qpos * pppos[l] + (long long) qneg * ppneg[l];
			qpos = qqpos[l] < sz[l] ? qqpos[l] : qpos + sz[l];
			qneg = qqneg[l] < sz[l] ? qqneg[l] : qneg + sz[l];
			l++;
		}
		if ((r & 1) == 0) {
			x += st[r] + (long long) qqpos[r] * ppos + (long long) qqneg[r] * pneg;
			ppos = pppos[r] < sz[r] ? pppos[r] : sz[r] + ppos;
			pneg = ppneg[r] < sz[r] ? ppneg[r] : sz[r] + pneg;
			r--;
		}
	}
	x += (long long) qpos * ppos + (long long) qneg * pneg;
	return x;
}
int main() {
	static int aa[N];
	int n, q, i;
	scanf("%d%d", &n, &q);
	for (i = 0; i < n; i++)
		scanf("%d", &aa[i]);
	build(aa, n);
	while (q--) {
		static char s[2];
		int l, r, x;
		scanf("%s%d%d", s, &l, &r), l--, r--;
		if (s[0] == '*') {
			update(l, r, -1, 0);
			if (l > 0)
				upd_(l - 1, sgn(query(l) - query(l - 1)) * ((l - 1) % 2 == 0 ? 1 : -1));
			update_(l, r - 1);
			if (r + 1 < n)
				upd_(r, sgn(query(r + 1) - query(r)) * (r % 2 == 0 ? 1 : -1));
		} else if (s[0] == '+') {
			scanf("%d", &x);
			update(l, r, 1, x);
			if (l > 0)
				upd_(l - 1, sgn(query(l) - query(l - 1)) * ((l - 1) % 2 == 0 ? 1 : -1));
			if (r + 1 < n)
				upd_(r, sgn(query(r + 1) - query(r)) * (r % 2 == 0 ? 1 : -1));
		} else
			printf("%lld\n", query_(l, r - 1) + r - l + 1);
	}
	return 0;
}
Compilation message (stderr)
Main.c: In function 'main':
Main.c:166:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  166 |  scanf("%d%d", &n, &q);
      |  ^~~~~~~~~~~~~~~~~~~~~
Main.c:168:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  168 |   scanf("%d", &aa[i]);
      |   ^~~~~~~~~~~~~~~~~~~
Main.c:174:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  174 |   scanf("%s%d%d", s, &l, &r), l--, r--;
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~
Main.c:183:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  183 |    scanf("%d", &x);
      |    ^~~~~~~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |