Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- struct segTree {
- int size = 1;
- vector<pair<long long, int>> mins;
- void init(int n) {
- while(size < n) {
- size *= 2;
- }
- mins.assign(2*size, {LLONG_MAX, 1});
- }
- void set(int i, long long v, int x, int lx, int rx) {
- if(rx-lx == 1) {
- mins[x] = {v, 1};
- return;
- }
- int m = (lx+rx)/2;
- if(i < m) {
- set(i, v, 2*x+1, lx, m);
- } else {
- set(i, v, 2*x+2, m, rx);
- }
- if(mins[2*x+1].first == mins[2*x+2].first) {
- mins[x] = {mins[2*x+1].first, mins[2*x+1].second+mins[2*x+2].second};
- } else if(mins[2*x+1].first < mins[2*x+2].first) {
- mins[x] = mins[2*x+1];
- } else {
- mins[x] = mins[2*x+2];
- }
- }
- void set(int i, long long v) {
- set(i, v, 0, 0, size);
- }
- pair<long long, int> getMin(int l, int r, int x, int lx, int rx) {
- if(lx >= r || rx <= l) {
- return {LLONG_MAX, 1};
- }
- if(l <= lx && rx <= r) {
- return mins[x];
- }
- int m = (lx+rx)/2;
- pair<long long, int> m1 = getMin(l, r, 2*x+1, lx, m), m2 = getMin(l, r, 2*x+2, m, rx);
- if(m1.first == m2.first) {
- return {m1.first, m1.second+m2.second};
- } else if(m1.first < m2.first) {
- return m1;
- } else {
- return m2;
- }
- }
- pair<long long, int> getMin(int l, int r) {
- return getMin(l, r, 0, 0, size);
- }
- };
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL); cout.tie(NULL);
- int n, q; cin >> n >> q;
- segTree st; st.init(n);
- for(int i = 0; i < n; i++) {
- long long v; cin >> v;
- st.set(i, v);
- }
- while(q--) {
- int op; cin >> op;
- if(op == 1) {
- int i; long long v;
- cin >> i >> v;
- st.set(i, v);
- } else {
- int l, r;
- cin >> l >> r;
- pair<long long, int> mi = st.getMin(l, r);
- cout << mi.first << " " << mi.second << "\n";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement