复杂度证明?
查看原帖
复杂度证明?
1063855
xu_zhihao楼主2024/9/28 17:44
#include<bits/stdc++.h>
using namespace std;
int n,q;
int st[200010][25];
int p[200010];
int s,t;
void Init(){
	for(int i=1;i<=n;i++){
		st[i][0]=p[i];
	}
	for(int j=1;j<=t;j++){
		for(int i=1;i<=n;i++)if(i+(1<<j)-1<=n){
			st[i][j]=abs(st[i][j-1]-st[i+(1<<(j-1))][j-1]);
		}
	}
	return;
}
int check(int l,int k){
	if(k<=t){
		return st[l][k];
	}
	int ans=abs(check(l,k-1)-check(l+(1<<(k-1)),k-1));
	return ans;
}
int Find(int l,int k){
	if(k<=t){
		int ans=st[l][k];
		return ans;
	}
	int ans=check(l,k);
	return ans;
}
void Work(int id,int r){
	st[id][0]=r;
	for(int j=1;j<=t;j++){
		int w=max(id-(1<<j)+1,1);
		for(int i=w;i<=id;i++)if(i+(1<<j)-1<=n){
			st[i][j]=abs(st[i][j-1]-st[i+(1<<(j-1))][j-1]);
		}
	}
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%d",&p[i]);
	}
	s=sqrt(n);
    t=log2(s);
	Init();
	while(q--){
		int op;
		scanf("%d",&op);
		if(op==1){
			int i,r;
			scanf("%d%d",&i,&r);
			Work(i,r);
		}
		else{
			int l,k;
			scanf("%d%d",&l,&k);
			int ans=Find(l,k);
			printf("%d\n",ans);
		}
	}
	return 0;
} 
2024/9/28 17:44
加载中...