比赛 树形数据结构拔高 评测结果 RRRRRRRRRR
题目名称 聪聪的世界 最终得分 0
用户昵称 LikableP 运行时间 0.011 s
代码语言 C++ 内存使用 1.37 MiB
提交时间 2025-04-17 21:59:49
显示代码纯文本
#include <cstdio>
#define ls(x) x << 1
#define rs(x) x << 1 | 1
typedef long long ll;

template <typename T>
void swap(T &x, T &y) {
	x ^= y ^= x ^= y;
}
//template <typename T>
//T max(T x, T y) {
//	return x > y ? x : y;
//}
//template <typename T>
//T min(T x, T y) {
//	return x < y ? x : y;
//}

const int MAXN = 1e6 + 10;

int n, m;
ll a[MAXN];

//struct NODE {
//	ll maxx, minn;
//	ll lazy;
//} node[MAXN << 2];
//
//
//void Merge(int root) {
//	node[root].maxx = max(node[ls(root)].maxx, node[rs(root)].maxx);
//	node[root].minn = min(node[ls(root)].minn, node[rs(root)].minn);
//}
//void Build(int root, int lt, int rt) {
//	if (lt == rt) {
//		node[root].maxx = node[root].minn = a[lt];
//		return ;
//	}
//	int mid = lt + ((rt - lt) >> 1);
//	Build(ls(root), lt, mid);
//	Build(rs(root), mid + 1, rt);
//	Merge(root);
//}
//void PushDown(int root, int lt, int rt) {
//	if (node[root].lazy) {
//		node[ls(root)].maxx += node[root].lazy;
//		node[ls(root)].minn += node[root].lazy;
//		node[ls(root)].lazy += node[root].lazy;
//		node[rs(root)].maxx += node[root].lazy;
//		node[rs(root)].minn += node[root].lazy;
//		node[rs(root)].lazy += node[root].lazy;
//		node[root].lazy = 0;
//	}
//}
//void AddSeq(int root, int lt, int rt, int lq, int rq, int val) {
//	if (lt == rt) {
//		node[root].lazy += val;
//		node[root].maxx += val;
//		return ;
//	}
//	PushDown(root, lt, rt);
//	int mid = lt + ((rt - lt) >> 1);
//	if (rq <= mid) {
//		AddSeq(ls(root), lt, mid, lq, rq, val);
//	} else if (lq > mid) {
//		AddSeq(rs(root), mid + 1, rt, lq, rq, val);
//	} else {
//		AddSeq(ls(root), lt, mid, lq, mid, val);
//		AddSeq(rs(root), mid + 1, rt, mid + 1, rq, val);
//	}
//	Merge(root);
//}
//ll GetSingle(int root, int lt, int rt, int x) {
//	if (lt == rt) {
//		return node[root].maxx;
//	}
//	PushDown(root, lt, rt);
//	int mid = lt + ((rt - lt) >> 1);
//	if (x <= mid) {
//		return GetSingle(ls(root), lt, mid, x);
//	} else {
//		return GetSingle(rs(root), mid + 1, rt, x);
//	}
//}
//void SetSingle(int root, int lt, int rt, int x, int val) {
//	if (lt == rt) {
//		node[root].maxx = node[root].minn = val;
//		return ;
//	}
//	PushDown(root, lt, rt);
//	int mid = lt + ((rt - lt) >> 1);
//	if (x <= mid) {
//		SetSingle(ls(root), lt, mid, x, val);
//	} else {
//		SetSingle(rs(root), mid + 1, rt, x, val);
//	}
//	Merge(root);
//}
//ll GetFirstLessLeft(int root, int lt, int rt, int x, int val) {
//	return 0;
//}
//
//void Work2() {
//	Build(1, 1, n);
//	while (m--) {
//		int opt, x, y, w;
//		scanf("%d", &opt);
//		if (opt == 1) {
//			scanf("%d", &x);
//			
//		} else if (opt == 2) {
//			scanf("%d", &x);
//		} else if (opt == 3) {
//			scanf("%d", &x);
//		} else if (opt == 4) {
//			scanf("%d", &x);
//		} else if (opt == 5) {
//			scanf("%d %d", &x, &y);
//			ll temp = GetSingle(1, 1, n, x);
//			SetSingle(1, 1, n, x, GetSingle(1, 1, n, y));
//			SetSingle(1, 1, n, y, temp);
//		} else if (opt == 6) {
//			scanf("%d %d %d", &x, &y, &w);
//			AddSeq(1, 1, n, x, y, w);
//		} else if (opt == 7) {
//			scanf("%d %d %d", &x, &y, &w);
//			AddSeq(1, 1, n, x, y, -w);
//		}
//	}
//}

void Work1() {
	while (m--) {
		int opt, x, y;
		ll w;
		scanf("%d", &opt);
		if (opt == 1) {
			scanf("%d", &x);
			for (int i = x; i >= 1; --i) {
				if (a[i] < a[x]) {
					printf("%lld\n", a[i]);
					break;
				}
				if (i == 1) printf("-1\n");
			}
		} else if (opt == 2) {
			scanf("%d", &x);
			for (int i = x; i >= 1; --i) {
				if (a[i] > a[x]) {
					printf("%lld\n", a[i]);
					break;
				}
				if (i == 1) printf("-1\n");
			}
		} else if (opt == 3) {
			scanf("%d", &x);
			for (int i = x; i <= n; ++i) {
				if (a[i] < a[x]) {
					printf("%lld\n", a[i]);
					break;
				}
				if (i == n) printf("-1\n");
			}
		} else if (opt == 4) {
			scanf("%d", &x);
			for (int i = x; i <= n; ++i) {
				if (a[i] > a[x]) {
					printf("%lld\n", a[i]);
					break;
				}
				if (i == n) printf("-1\n");
			}
		} else if (opt == 5) {
			scanf("%d %d", &x, &y);
			swap(a[x], a[y]);
		} else if (opt == 6) {
			scanf("%d %d %lld", &x, &y, &w);
			for (int i = x; i <= y; ++i) {
				a[i] += w;
			}
		} else if (opt == 7) {
			scanf("%d %d %lld", &x, &y, &w);
			for (int i = x; i <= y; ++i) {
				a[i] -= w;
			}
		}
	}
}

int main() {
	freopen("ccsworld8.in", "r", stdin);
	freopen("ccsworld8.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
	}
	if (n <= 10000) {
		Work1();
	} else {
		Work1();
	}
	return 0;
}