Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #define INF 100000000
- using namespace std;
- vector<pair<int,int>> t;
- void build_tree(int v, int tl, int tr, vector<int> a){
- if(tl==tr)
- t[v]=make_pair(a[tl], 1);
- else{
- int tm=(tl+tr)/2;
- build_tree(v*2, tl, tm, a);
- build_tree(v*2+1, tm+1, tr, a);
- if(t[v*2].first==t[v*2+1].first){
- t[v]=make_pair(t[v*2].first, (t[v*2].second + t[v*2+1].second));
- }
- else{
- if(t[v*2].first > t[v*2+1].first){
- t[v]=make_pair(t[v*2].first, t[v*2].second);
- }
- else{
- t[v]=make_pair(t[v*2+1].first, t[v*2+1].second);
- }
- }
- }
- }
- /*
- int sum (int v, int tl, int tr, int l, int r) {
- if (l > r)
- return 0;
- if (l == tl && r == tr)
- return t[v];
- int tm = (tl + tr) / 2;
- return sum (v*2, tl, tm, l, min(r,tm))
- + sum (v*2+1, tm+1, tr, max(l,tm+1), r);
- }
- */
- pair<int,int> num_max (int v, int tl, int tr, int l, int r) {
- if (l > r)
- return make_pair(-INF, 0);
- if (l == tl && r == tr)
- return t[v];
- int tm = (tl + tr) / 2;
- pair<int,int> p1,p2;
- p1=num_max(v*2, tl, tm, l, min(r,tm));
- p2=num_max(v*2+1, tm+1, tr, max(l,tm+1), r);
- if(p1.first==p2.first){
- return(make_pair(p1.first, (p1.second + p2.second)));
- }
- else{
- if(p1.first > p2.first){
- return(make_pair(p1.first, p1.second));
- }
- else{
- return(make_pair(p2.first, p2.second));
- }
- }
- }
- void update (int v, int tl, int tr, int pos, int new_val) {
- if (tl == tr)
- t[v] = make_pair(new_val, 1);
- else {
- int tm = (tl + tr) / 2;
- if (pos <= tm)
- update (v*2, tl, tm, pos, new_val);
- else
- update (v*2+1, tm+1, tr, pos, new_val);
- pair<int,int> p1=t[v*2],p2=t[v*2+1];
- if(p1.first==p2.first){
- t[v]=make_pair(p1.first, (p1.second + p2.second));
- }
- else{
- if(p1.first > p2.first){
- t[v]=(make_pair(p1.first, p1.second));
- }
- else{
- t[v]=(make_pair(p2.first, p2.second));
- }
- }
- }
- }
- int main(){
- int n;
- cin>>n;
- vector<int> a;
- t.resize(4*n,make_pair(0,0));
- for(int i=0;i<n;i++){
- int b;cin>>b;
- a.push_back(b);
- }
- build_tree(1,0,n-1,a);
- // for(int i=0;i<t.size();i++){
- // cout<<t[i]<<'\n';
- // }
- int m;
- cin>>m;
- for(int i=0;i<m;i++){
- char ch;
- cin>>ch;
- int a,b;
- cin>>a>>b;
- if(ch=='s')
- cout<<num_max(1,0,n-1,a-1,b-1).second<<" ";
- if(ch=='u')
- update(1,0,n-1,a-1,b);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement