这题的新解法
查看原帖
这题的新解法
1067686
1013_qwq楼主2023/8/26 16:10

今天我和机房同学打赌,说这题可以用树状数组写。让后我就去写了,然后过了,我把它分享给大家(大号被禁言了)

提交记录

code:

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int n,m,l,r;
int maxn[200005],a[200005];
int lowbit(int x){return x&(-x);}
int main(){
	freopen("P3865.in","r",stdin);
	freopen("P3865.out","w",stdout);
	n=read();
	m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		for(int j=i;j<=n&&j>0;j+=lowbit(j))
			maxn[j]=max(a[i],maxn[j]);
	}
	for(int i=1;i<=m;i++){
		l=read();
		r=read();
		int ans=0;
		while(1){
			if(l>=r)break;
			while(1){
			//	printf("%d ",r);
				if(r-lowbit(r)<l)break;
				ans=max(maxn[r],ans);
				r-=lowbit(r);
			}
			ans=max(a[r],ans);
			r--;
		}
		printf("%d\n",max(ans,a[l]));
	}
}
2023/8/26 16:10
加载中...