玄关求调
查看原帖
玄关求调
716372
lujunxuan123楼主2025/1/21 08:45
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,i,x,opt[1000010],j,xyy,a[100010][22],tr[1000010],lg[1000010],l[1000010],r[1000010];
vector<int> t[1000010],g[1000010],b[1000010];
int lowbit(int x){return x&-x;}
int qiu(int l,int r){
	int len=lg[r-l+1];
	return min(a[l][len],a[r-(1<<len)+1][len]);
}
void add(int x,int y){for(;x<=n;x+=lowbit(x))tr[x]+=y;}
int qiuu(int x){
	int sum=0;
	for(;x;x-=lowbit(x))sum+=tr[x];
	return sum;
}
signed main(){
	cin>>n>>m;
	for(i=1;i<=n;i++)
		a[i][0]=m+1;
	for(i=1;i<=m;i++){
		cin>>opt[i];
		if(opt[i]==1){
			cin>>x;
			a[x][0]=min(a[x][0],i);
		}
		else
			cin>>l[i]>>r[i];
	}
	
	for(i=2;i<=1000000;i++)lg[i]=lg[i/2]+1;
	for(xyy=1;xyy<=20;xyy++)
		for(i=1;i<=n-(1<<xyy)+1;i++)
			a[i][xyy]=min(a[i][xyy-1],a[i+(1<<(xyy-1))][xyy-1]);
	for(i=1;i<=n;i++){
		t[i].push_back(0);
		for(j=1;j<=n;j+=i)
			t[i].push_back(qiu(j,min(n,j+i-1)));	
	}
	for(i=1;i<=n;i++){
		g[i].push_back(0);
		add(i,1);
		for(j=1;j<=n;j+=i){
			g[i].push_back(max(g[i][j/i],t[i][j/i+1]));	
			b[g[i][j/i+1]].push_back(i);
		}
	}
	for(i=1;i<=m;i++){
		if(opt[i]==1){
			for(j=0;j<(int)b[i].size();j++)
				add(b[i][j],1);
		}
		else{
			cout<<qiuu(r[i])-qiuu(l[i]-1)<<'\n';
		}
	}
} 
2025/1/21 08:45
加载中...