第九个测试点re
  • 板块学术版
  • 楼主Enjoystudy
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/12 10:52
  • 上次更新2024/7/12 11:52:00
查看原帖
第九个测试点re
1265364
Enjoystudy楼主2024/7/12 10:52

https://codeforces.com/edu/course/2/lesson/4/1/practice/contest/273169/problem/C

#include <bits/stdc++.h>

using namespace std;

class Node{
	public:
		long long Min, num;
};

namespace sgt{
	
	using T = long long;
	
	constexpr int INF = 1e9 + 7;
	constexpr int rt = 1;
	
	int n;
	
	vector <Node> tree;
	
	Node init(T x, T y) {
		return {x, y};
	} 
	
	Node merge(const Node &a, const Node &b) {
//		cerr << "fuogwyief";
		Node ret;
		if (a.Min < b.Min) { ret = a; }
		else if (b.Min < a.Min) { ret = b; }
		else { ret = init(a.Min, a.num + b.num); }
		return ret;
	}
	
	void build(const vector <T> &a, int p = rt, int l = 0, int r = n - 1) {
//		cerr << "fuogwyief";
		if (l == r) { tree[p] = init(a[l], 1); return; }
		auto mid = (l + r) >> 1, lc = p << 1, rc = lc + 1;
		build(a, lc, l, mid), build(a, rc, mid + 1, r);
		tree[p] = merge(tree[lc], tree[rc]);
	}
	
	void sgt(vector <T> &a) {
//		cerr << "fuogwyief";
		n = a.size();
		tree.resize(n << 2);
		build(a);
	}
	
	void modify(int pos, int v, int p = rt, int l = 0, int r = n - 1) {
//		cerr << pos << ' ' << v << ' ' << p << ' ' << l << ' ' << r << '\n';
		if (l > pos || r < pos) { return; }
		if (l == r && l == pos) { tree[p] = init(v, 1); return; }
		auto mid = (l + r) >> 1, lc = p << 1, rc = lc + 1;
		modify(pos, v, lc, l, mid), modify(pos, v, rc, mid + 1, r);
		tree[p] = merge(tree[lc], tree[rc]);
	}
	
	Node query(int L, int R, int p = rt, int l = 0, int r = n - 1) {
//		cerr << L << ' ' << R << ' ' << p << ' ' << l << ' ' << r << '\n';
		if (l > R || r < l) { return init(INF, 1); }
		if (L <= l && r <= R) { return tree[p]; }
		auto mid = (l + r) >> 1, lc = p << 1, rc = lc + 1;
//		cerr << mid << ' ' << lc << ' ' << rc << '\n';
		return merge(query(L, R, rc, mid + 1, r), query(L, R, lc, l, mid));
	}
	
}

void solve() {
	int n, m; cin >> n >> m;
	vector <long long> a(n); for (auto &i : a) cin >> i;
	sgt::sgt(a);

//	cerr << "fuogwyief";
	
	while (m--) {
		int op, l, r;
		cin >> op >> l >> r;
		if (op == 1) { sgt::modify(l, r); }
		else { Node t = sgt::query(l, r - 1); cout << t.Min << ' ' << t.num << '\n';}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	
	int T = 1;
	
//	cin >> T;
	
	while (T--) {
		solve();
	}
	
	return 0;
}
2024/7/12 10:52
加载中...