线段树基础题,动态在线维护区间最大值和最小值,一发过
具体看注释:
/********************************************************************* 程序名: 版权: Joecai 作者: Joecai 日期: 2022-04-06 14:55 说明: *********************************************************************/ #include <bits/stdc++.h> using namespace std; #define x first #define y second # define rep(i,be,en) for(int i=be;i<=en;i++) # define pre(i,be,en) for(int i=be;i>=en;i--) typedef pair<int, int> PII; #define ll long long #define endl "\n" #define LOCAL #define pb push_back #define eb emplace_back #define sp(i) setprecision(i) const int N = 1e6 + 10, INF = 0x3f3f3f3f; struct node { int l;//区间左端点 int r;//区间右端点 int mi;//区间最小值 int mx;//区间最大值 } tr[N << 2]; int a[N]; void init(int n) { for (int i = 1; i <= n; i++) { a[i] = 100; } } void pushup(int u)//传递子树对父亲的影响 { tr[u].mi = min(tr[u << 1].mi, tr[u * 2 + 1].mi);//维护区间最小值 tr[u].mx = max(tr[u << 1].mx, tr[u << 1 | 1].mx);//维护区间最小值 } void build(int u, int l, int r)//构建线段树 { tr[u] = {l, r}; if (l == r) { tr[u].mx = a[r]; tr[u].mi = a[r]; return; } int mid = l + r >> 1; build(u << 1, l, mid); build(u << 1 | 1, mid + 1, r); pushup(u); } void add(int u, int p, int x)//直接单点修改 { if (tr[u].l == tr[u].r) { if (tr[u].l == p) { tr[u].mi += x; tr[u].mx += x; } return; } int mid = tr[u].l + tr[u].r >> 1; if (p <= mid) add(u << 1, p, x); else add(u << 1 | 1, p, x); pushup(u); } int querymi(int u, int l, int r)//直接传递1-n的最小值 { return tr[u].mi; } int querymx(int u, int l, int r)//直接传递1-n,的最大值 { return tr[u].mx; } void solve() { int n, m; cin >> n >> m; init(n); build(1, 1, n); for (int i = 1; i <= m; i++) { int t; cin >> t; if (t == 1) { int p, x; cin >> p >> x; a[p] += x; add(1, p, x); } else { cout << querymx(1, 1, n) << ' ' << querymi(1, 1, n) << endl; } } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); //#ifdef LOCAL //freopen("data.in.txt","r",stdin); //freopen("data.out.txt","w",stdout); //#endif int __ = 1; //cin>>__; while (__--) { solve(); } return 0; }
点个赞再走叭~