Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define ull unsigned long long
- #define fixed(n) cout << fixed << setprecision(n);
- #define mod 1000000007
- #define cin(v) for (auto&i:v) cin >> i;
- #define cout(v) for (auto&i:v) cout << i << " ";
- #define ceil(n,m) (n / m + (n%m != 0))
- #define all(v) v.begin(), v.end()
- #define rall(v) v.rbegin(), v.rend()
- void lil_codi_vert(){
- ios_base::sync_with_stdio(false);
- cin.tie(NULL); cout.tie(NULL);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
- #endif
- }
- struct node{
- ll mn , freq;
- node(ll m){
- mn = m;
- freq = 1;
- }
- };
- struct segtree{
- vector<node> tree;
- ll size = 1;
- segtree(ll n){
- while(size < n) size *= 2;
- tree.assign(size * 2, 0);
- }
- node operation(node& a, node& b){
- if(a.mn == b.mn){
- node ans = a;
- ans.freq += b.freq;
- return ans;
- }
- if(a.mn < b.mn) return a;
- return b;
- }
- void build(vector<ll>& v, ll idx, ll tl, ll tr){
- if(tl >= (ll)v.size()) return;
- if(tl == tr){
- tree[idx] = v[tl];
- return;
- }
- ll mid = tl + (tr - tl) / 2;
- build(v, idx * 2 + 1, tl, mid);
- build(v, idx * 2 + 2, mid + 1, tr);
- tree[idx] = operation(tree[idx * 2 + 1], tree[idx * 2 + 2]);
- }
- void build(vector<ll>& v){
- build(v, 0, 0, size-1);
- }
- node query(ll l, ll r, ll idx, ll tl, ll tr){
- if(tl > r || tr < l) return node(LLONG_MAX);
- if(l <= tl && tr <= r) return tree[idx];
- ll mid = tl + (tr-tl)/2;
- node left = query(l, r, idx * 2 + 1, tl, mid);
- node right = query(l, r, idx * 2 + 2, mid + 1, tr);
- return operation(left, right);
- }
- node query(ll l, ll r){
- return query(l, r, 0, 0, size - 1);
- }
- void update(ll i, ll val, ll idx, ll tl, ll tr){
- if(i < tl || i > tr) return;
- if(tl == tr){
- tree[idx] = val;
- return;
- }
- ll mid = tl + (tr - tl) / 2;
- update(i, val, idx * 2 + 1, tl, mid);
- update(i, val, idx * 2 + 2, mid + 1, tr);
- tree[idx] = operation(tree[idx * 2 + 1], tree[idx * 2 + 2]);
- }
- void update(ll i, ll val){
- update(i, val, 0, 0, size - 1);
- }
- };
- int main(){
- lil_codi_vert();
- ll n, q; cin >> n >> q;
- vector<ll> v(n); cin(v);
- segtree seg(n);
- seg.build(v);
- while(q--){
- ll ty; cin >> ty;
- if(ty == 1){
- ll i, val; cin >> i >> val;
- seg.update(i, val);
- }else{
- ll l, r; cin >> l >> r;
- node ans = seg.query(l, r-1);
- cout << ans.mn << " " << ans.freq << "\n";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement