T1抱灵···
  • 板块灌水区
  • 楼主MspAInt
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/10/3 18:02
  • 上次更新2023/10/29 10:54:40
查看原帖
T1抱灵···
736801
MspAInt楼主2022/10/3 18:02
#include<bits/stdc++.h>
using namespace std;
int MAX;
struct node{
	int l,r;
	int v;
}t[200001];
int a[200001];
bool flag;
void update(int k){
	t[k].v=t[k*2].v*t[k*2+1].v;
	return;
}
void addtree(int k,int l,int r){
	t[k].l=l,t[k].r=r;
	if(l==r){
		t[k].v=a[l];
		return;
	}
	int mid=(l+r)/2;
	addtree(k*2,l,mid);
	addtree(k*2+1,mid+1,r);
	update(k);
}
void fix(int k,int x,int y){
	int l=t[k].l;
	int r=t[k].r;
	if(l==r){
		t[k].v=y;
		return;
	}
	int mid=(l+r)/2;
	if(mid>=x)fix(k*2,x,y);
	else if(mid<x)fix(k*2+1,x,y);
	update(k);
}
int behind(int k){
	int l=t[k].l,r=t[k].r;
	if(l==r)return 1;
	return max(t[k].v,max(behind(k*2),behind(k*2+1)));
}
void before(int k,int x,int y){
	if(flag)return;
	int l=t[k].l,r=t[k].r;
	if(l==x&&r==y){
		flag=1;
		int ret=behind(k);
		if(ret>MAX)cout<<"Too large"<<endl;
		else cout<<ret<<endl;
		return;
	}
	int mid=(l+r)/2;
	if(mid>=x)before(k*2,x,y);
	else if(mid<y)before(k*2+1,x,y);
	return;
}
int main(){
	MAX=pow(2,30);
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	addtree(1,1,n);
	for(int i=1;i<=q;i++){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1){
			fix(1,x,y);
		}else{
			flag=0;
			before(1,x,y);
		}
	}
	return 0;
}

rt,样例能过···qaq

2022/10/3 18:02
加载中...