线段树
查看原帖
线段树
443023
chenkuo楼主2023/10/13 12:44

样例过了,但是

#include<bits/stdc++.h>
using namespace std;
int m,d,n,a[200001],z,k,t,h[200001];
char c;
struct asd{
	int left,right,zh;
}tree[400005];
void build(int left,int right,int bh){
	tree[bh].left=left;
	tree[bh].right=right;
	if(left==right){
		h[left]=bh;
		return;
	}
	int mid=(left+right)>>1;
	build(left,mid,bh*2);
	build(mid+1,right,bh*2+1);
}
void add(int k){
	if(k==1) return;
	if(tree[k/2].zh<tree[k].zh){
		tree[k/2].zh=tree[k].zh;
		add(k/2);
	}
}
int find(int l,int r,int k){
	if(tree[k].left==tree[k].right) return tree[k].zh;
	int mid=(tree[k].left+tree[k].right)>>1;
	if(r<=mid) return find(l,r,k*2);
	if(l>mid) return find(l,r,k*2+1);
	return max(find(l,mid,k*2),find(mid+1,r,k*2+1));
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>m>>d;
	n=m;
	build(1,n,1);
	while(m--){
		cin>>c>>k;
		if(c=='A'){
			a[++z]=(k+t)%d;
			tree[h[z]].zh=a[z];
			add(h[z]);
		}
		if(c=='Q'){
			t=find(z-k+1,z,1);
			printf("%d\n",t);
		}
	}
}
2023/10/13 12:44
加载中...