有没有大佬帮忙看看我昨晚F的代码,我今天看不懂了
  • 板块学术版
  • 楼主无名之雾
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/3 10:01
  • 上次更新2024/3/3 10:37:03
查看原帖
有没有大佬帮忙看看我昨晚F的代码,我今天看不懂了
704275
无名之雾楼主2024/3/3 10:01
#include <bits/stdc++.h>
using namespace std;
long long read(){
    long long x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')
          f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}
void write(long long x){
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(x>9)
	  write(x/10);
	putchar(x%10+'0');
}
long long n,m,op,x,y,l,r;
long long a[200005];
set<long long> s;
struct St{
	long long Max1,Max2;
	long long sum1,sum2;
	St(){
		Max1=Max2=sum1=sum2=0;
	}
};
struct Node{
	long long l,r;
	St h;
}X[200005<<2];
St Union(St a,St b){
	St ans;
	s.clear();
	ans.sum1=ans.sum2=0;
	ans.Max1=max(a.Max1,b.Max1);
	if(ans.Max1==a.Max1)ans.sum1+=a.sum1;
	if(ans.Max1==b.Max1)ans.sum1+=b.sum1;
	s.insert(a.Max1);
	if(a.Max2)s.insert(a.Max2);
	s.insert(b.Max1);
	if(b.Max2)s.insert(b.Max2);
	if(s.size()==1){
		ans.Max2=0;
		return ans;
	}
	auto it=s.end();
	it--;
	it--;
	ans.Max2=*it;
	if(ans.Max2==a.Max1)ans.sum2+=a.sum1;
	if(ans.Max2==b.Max1)ans.sum2+=b.sum1;	
	if(ans.Max2==a.Max2)ans.sum2+=a.sum2;
	if(ans.Max2==b.Max2)ans.sum2+=b.sum2;
	return ans;
}
void pushup(long long k){
	X[k].h=Union(X[k<<1].h,X[k<<1|1].h);
}
void build(long long k,long long l,long long r){
	X[k].l=l,X[k].r=r;
	if(l==r){
		X[k].h.Max1=a[l];
		X[k].h.sum1=1;
		return ;
	}
	long long mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	pushup(k);
}
void add(long long k,long long i,long long v){
	if(X[k].l==i&&i==X[k].r){
		X[k].h.Max1=v;
		return ;
	}
	long long mid=(X[k].l+X[k].r)>>1;
	if(i<=mid)add(k<<1,i,v);
	else add(k<<1|1,i,v);
	pushup(k);
}
St qurey(long long k,long long l,long long r){
	if(X[k].l==l&&r==X[k].r)
	  return X[k].h;
	long long mid=(X[k].l+X[k].r)>>1;
	if(r<=mid)return qurey(k<<1,l,r);
	else if(l>mid)return qurey(k<<1|1,l,r);
	else return Union(qurey(k<<1,l,mid),qurey(k<<1|1,mid+1,r));
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build(1,1,n);
	while(m--){
		op=read(),x=read(),y=read();
		if(op==1)add(1,x,y);
		else{
			write(qurey(1,x,y).sum2);
			putchar('\n');
		}
	}
	return 0;
}
2024/3/3 10:01
加载中...