比赛 |
树形数据结构拔高 |
评测结果 |
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;
}