Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Goal to be a Master */
- #include <algorithm>
- #include <bits/stdc++.h>
- #include<string>
- using namespace std;
- #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- #define vi vector<int>
- #define ll long long
- #define pb push_back
- #define mp make_pair
- #define all(x) x.begin(),x.end()
- const int maxN=1e5+1;
- pair<int,int> st[4*maxN];
- int a[maxN];
- void build(int si,int ss,int se)
- {
- if(ss==se)
- {
- st[si]=mp(a[ss],1);
- return ;
- }
- else{
- int mid=(se+ss)/2;
- build(2*si+1,ss,mid);
- build(2*si+2,mid+1,se);
- st[si].first=min(st[2*si+2].first,st[2*si+1].first);
- if(st[2*si+2].first<st[2*si+1].first)
- st[si].second=st[2*si+2].second;
- else if(st[2*si+2].first>st[2*si+1].first)
- st[si].second=st[2*si+1].second;
- else
- st[si].second=st[2*si+1].second+st[2*si+2].second;
- }
- }
- void update(int si,int ss,int se,int idx,int data)
- {
- if(se<idx || ss>idx)
- return;
- if(se==ss)
- {
- if(ss==idx)
- st[si]=mp(data,1);
- else
- st[si]=mp(a[ss],1);
- return;
- }
- else
- {
- int mid=(se+ss)/2;
- update(2*si+1,ss,mid,idx,data);
- update(2*si+2,mid+1,se,idx,data);
- st[si].first=min(st[2*si+2].first,st[2*si+1].first);
- if(st[2*si+2].first<st[2*si+1].first)
- st[si].second=st[2*si+2].second;
- else if(st[2*si+2].first>st[2*si+1].first)
- st[si].second=st[2*si+1].second;
- else
- st[si].second=st[2*si+1].second+st[2*si+2].second;
- }
- }
- pair<int,int> query(int si,int ss,int se,int qs,int qe)
- {
- if(qs>qe)
- return {INT_MAX,1};
- if(ss==qs && se==qe)
- return st[si];
- else
- {
- int mid=(ss+se)/2;
- pair<int,int> l=query(2*si+1,ss,mid,qs,min(mid,qe));
- pair<int,int> r=query(2*si+2,mid+1,se,max(mid+1,qs),qe);
- st[si].first=min(l.first,r.first);
- if(l.first<r.first)
- st[si].second=l.second;
- else if(l.first>r.first)
- st[si].second=r.second;
- else
- st[si].second=l.second+r.second;
- return st[si];
- }
- }
- int main()
- {
- IOS
- int n,m;
- cin>>n>>m;
- for(int i=0;i<n;i++)
- cin>>a[i];
- build(0,0,n-1);
- while(m--)
- {
- int x;
- cin>>x;
- if(x==1)
- {
- int j,k;
- cin>>j>>k;
- update(0,0,n-1,j,k);
- }
- else
- {
- int j,k;
- cin>>j>>k;
- pair<int,int> h=query(0,0,n-1,j,k-1);
- cout<<h.first<<" "<<h.second<<"\n";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement