求调!!!
查看原帖
求调!!!
1037981
封禁用户楼主2023/10/24 06:15
#include <bits/stdc++.h>
#define ULL unsigned long long
using namespace std;
const int N = 250005, M = 1 << 19 | 9;
int n, m, i, j, k, x, y, a[N], b[N], u[M], s[N], t[N];
ULL ans[N];
struct XY {
	int x, y, i;
	bool operator<(const XY &A) const {
		return y < A.y;
	}
} d[N];
struct MR {
	ULL f[5][5];
} f[M], F, Y, Z;
struct DT {
	ULL g[5];
} g[M], z;
MR operator*(MR a, MR b) {
	MR c = Z;
	for (int i = 0; i < 5; i++) {
		for (int k = 0; k <= i; k++) {
			if (!a.f[i][k]) continue;
			for (int j = 0; j <= k; j++) {
				c.f[i][j] += a.f[i][k] * b.f[k][j];
			}
		}
	}
	return c;
}
DT operator*(MR a, DT b) {
	DT c = z;
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j <= i; j++) {
			c.g[i] += a.f[i][j] * b.g[j];
		}
	}
	return c;
}
void build(int p, int l, int r) {
	g[p].g[0] = r - l + 1;
	if (l == r) return ;
	int m = l + r >> 1, lc = p << 1, rc = lc | 1;
	build(lc, l, m);
	build(rc, m + 1, r);
}
void xia(int p, int lc, int rc) {
	f[lc] = u[lc] ? f[p] * f[lc] : f[p];
	g[lc] = f[p] * g[lc];
	f[rc] = u[rc] ? f[p] * f[rc] : f[p];
	g[rc] = f[p] * g[rc];
	u[p] = 0;
	u[lc] = u[rc] = 1;
}
void gai(int p, int l, int r, int x, int y) {
	if (x <= l && r <= y) {
		f[p] = u[p] ? F * f[p] : F, u[p] = 1;
		g[p] = F * g[p];
	} else {
		int m = l + r >> 1, lc = p << 1, rc = lc | 1;
		if (u[p]) xia(p, lc, rc);
		if (x <= m) gai(lc, l, m, x, y);
		if (y > m) gai(rc, m + 1, r, x, y);
		for (m = 0; m < 5; m++) {
			g[p].g[m] = g[lc].g[m] + g[rc].g[m];
		}
	}
}
ULL he(int p, int l, int r, int x, int y) {
	if (x <= l && r <= y) return g[p].g[4];
	int m = l + r >> 1, lc = p << 1, rc = lc | 1;
	ULL s = 0;
	if (u[p]) xia(p, lc, rc);
	if (x <= m) s += he(lc, l, m, x, y);
	if (y > m) s += he(rc, m + 1, r, x, y);
	return s;
}
int main() {
	scanf("%*d%d", &n);
	for (i = 1; i <= n; i++) scanf("%d", &a[i]);
	for (i = 1; i <= n; i++) scanf("%d", &b[i]);
	scanf("%d", &m);
	for (i = 1; i <= m; i++) {
		scanf("%d%d", &d[i].x, &d[i].y);
		d[i].i = i;
	}
	sort(d + 1, d + m + 1);
	for (i = 0; i < 5; i++) Y.f[i][i] = 1;
	build(1, 1, n);
	for (k = 1; k <= m; k++) {
		for (i = d[k - 1].y + 1; i <= d[k].y; i++) {
			while (x && a[i] > a[s[x]]) x--;
			F = Y;
			F.f[1][1] = F.f[3][3] = 0;
			F.f[1][0] = F.f[3][2] = a[i];
			gai(1, 1, n, s[x] + 1, i);
			while (y && b[i] > b[t[y]]) y--;
			F = Y;
			F.f[2][2] = F.f[3][3] = 0;
			gai(1, 1, n, t[y] + 1, i);
			F = Y;
			F.f[4][3] = 1;
			gai(1, 1, n, 1, s[++x] = t[++y] = i);
		}
		ans[d[k].i] = he(1, 1, n, d[k].x, d[k].y);
	}
	for (i = 1; i <= m; i++) printf("%llu\n", ans[i]);
}
2023/10/24 06:15
加载中...