RE求调
查看原帖
RE求调
1226952
Cosine_Func楼主2024/12/15 12:00
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define endl '\n'
#define itn int
#define pi pair<int,int>
//#define int ll
using namespace std;
const int MOD1=1e9+7;
const int MOD2=998244353;
const int N=1e6+5;
struct Node{
	int max1,max2,cnt1,cnt2;
}t[N<<2];
int n,q,op,pos,x,l,r,a[N];
void push_up(int p){
	#define m1(p) t[p].max1
	#define m2(p) t[p].max2
	#define c1(p) t[p].cnt1
	#define c2(p) t[p].cnt2
	if(m1(p*2)<m1(p*2+1)){
		m1(p)=m1(p*2+1),c1(p)=c1(p*2+1);
		if(m1(p*2)<m2(p*2+1))
			m2(p)=m2(p*2+1),c2(p)=c2(p*2+1);
		if(m1(p*2)>m2(p*2+1))
			m2(p)=m1(p*2),c2(p)=c1(p*2);
		if(m1(p*2)==m2(p*2+1))
			m2(p)=m1(p*2),c2(p)=c1(p*2)+c2(p*2+1); 
	}
	if(m1(p*2)>m1(p*2+1)){
		m1(p)=m1(p*2),c1(p)=c1(p*2);
		if(m1(p*2+1)<m2(p*2))
			m2(p)=m2(p*2),c2(p)=c2(p*2);
		if(m1(p*2+1)>m2(p*2))
			m2(p)=m1(p*2+1),c2(p)=c1(p*2+1);
		if(m1(p*2+1)==m2(p*2))
			m2(p)=m1(p*2+1),c2(p)=c1(p*2+1)+c2(p*2); 
	}
	if(m1(p*2)==m1(p*2+1)){
		m1(p)=m1(p*2),c1(p)=c1(p*2+1)+c1(p*2);
		if(m2(p*2)<m2(p*2+1))
			m2(p)=m2(p*2+1),c2(p)=c2(p*2+1);
		if(m2(p*2)>m2(p*2+1))
			m2(p)=m2(p*2),c2(p)=c2(p*2);
		if(m2(p*2)==m2(p*2+1))
			m2(p)=m2(p*2),c2(p)=c2(p*2)+c2(p*2+1);
	}
}
void build(int p,int l,int r){
	if(l==r){
		t[p].max1=a[l];
		t[p].cnt1=1;
		return;
	}
	int mid=l+(r-l)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	push_up(p);
}
void update(int p,itn l,int r,int pos,int x){
	if(l>pos or r<pos)
		return;
	if(l==r){
		t[p].max1=x;
		return;
	}
	int mid=l+(r-l)/2;
	update(p*2,l,mid,pos,x);
	update(p*2+1,mid+1,r,pos,x);
	push_up(p);
}
Node query(int p,int l,int r,int L,int R){
	#define m1(x) x.max1
	#define m2(y) y.max2
	#define c1(x) x.cnt1
	#define c2(y) y.cnt2
	if(L>r or R<l)
		return (Node){0,0,0,0};
	if(l<=L and R<=r)return t[p];
	int mid=l+(r-l)/2;
	Node x=query(p,l,r,L,mid);
	Node y=query(p,l,r,mid+1,R);
	Node z;
	if(m1(x)<m1(y)){
		m1(z)=m1(y),c1(z)=c1(y);
		if(m1(x)<m2(y))
			m2(z)=m2(y),c2(z)=c2(y);
		if(m1(x)>m2(y))
			m2(z)=m1(x),c2(z)=c1(x);
		if(m1(x)==m2(y))
			m2(z)=m1(x),c2(z)=c1(x)+c2(y); 
	}
	if(m1(x)>m1(y)){
		m1(z)=m1(x),c1(z)=c1(x);
		if(m1(y)<m2(x))
			m2(z)=m2(x),c2(z)=c2(x);
		if(m1(y)>m2(x))
			m2(z)=m1(y),c2(z)=c1(y);
		if(m1(y)==m2(x))
			m2(z)=m1(y),c2(z)=c1(y)+c2(x); 
	}
	if(m1(x)==m1(y)){
		m1(z)=m1(x),c1(z)=c1(y)+c1(x);
		if(m2(x)<m2(y))
			m2(z)=m2(y),c2(z)=c2(y);
		if(m2(x)>m2(y))
			m2(z)=m2(x),c2(z)=c2(x);
		if(m2(x)==m2(y))
			m2(z)=m2(x),c2(z)=c2(x)+c2(y);
	}
	return z;
}
inline void Solve(){
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	while(q--){
		cin>>op;
		if(op==1){
			cin>>pos>>x;
			update(1,1,n,pos,x);
		}
		if(op==2){
			cin>>l>>r;
			Node tmp=query(1,l,r,1,n);
			cout<<(tmp.max2?tmp.cnt2:0)<<endl;
		}
	}
}
signed main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    int T=1;
    //cin>>T;
    while(T--)
    	Solve();
    return 0;
}

2024/12/15 12:00
加载中...