树状数组0分求助
查看原帖
树状数组0分求助
521283
wangif424楼主2022/10/10 08:49
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b,len,maxi;
int s[1000001],h[1000001];
int t,l,r;
int lowbit(int x){
	return x&(-x);
} 
void update(int x){
	while(x<=len){
		h[x]=(s[x]%a+s[x]%b);
		int lx=lowbit(x);
		for(int i=1;i<lx;i++){
			h[x]=min(h[x],h[x-i]);
		}
		maxi=max(maxi,h[x]);
		x+=lx;
	}
}
int query(int x, int y) {
    int ans=0;
    while(y>=x) {
        ans=max(ans,(s[y]%a+s[y]%b));
		--y;
        while(y-lowbit(y)>=x) {
            ans=max(ans,h[y]);
            y-=lowbit(y);
        }
    }
    return ans;
}
signed main(){
	cin >> a >> b;
	len=a*b;
	for(int i=1;i<=len;++i){
		s[i]=i;
		update(i);
	}
	cin >> t;
	while(t--){
		cin >> l >> r;
		if(r-l+1>=len){
			cout << maxi;
			putchar('\n');
			continue;
		}
		l%=len;
		r%=len;
		int ans;
		if(r>=l)ans=query(l,r);
		else ans=max(query(1,r),query(l,len));
		cout << ans;
		putchar('\n');
	}
	return 0;
}

2022/10/10 08:49
加载中...