样例不过线段树求调
查看原帖
样例不过线段树求调
933802
ICU152_lowa_IS8楼主2024/1/28 21:46
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
	int val,tag;
}tree[400005<<2];
int a[400005],p;
int mod;
inline int ls(int p){
	return p<<1;
}
inline int rs(int p){
	return p<<1|1;
}
inline void pushup(int p){
	tree[p].val=max(tree[ls(p)].val,tree[rs(p)].val);
}
inline void pushdown(int l,int r,int p){
	int mid=l+r>>1;
	tree[ls(p)].tag+=tree[p].tag;
	tree[rs(p)].tag+=tree[p].tag;
	tree[ls(p)].val+=tree[p].tag*(mid-l+1);
	tree[rs(p)].val+=tree[p].tag*(r-mid);
	tree[p].tag=0;
}
inline void build(int l,int r,int p){
	if(l==r){
		tree[p].val=a[l];
		return;
	}
	int mid=l+r>>1;
	build(l,mid,ls(p));
	build(mid+1,r,rs(p));
	pushup(p);
}
inline void update(int l,int r,int ql,int qr,int p,int k){
	if(l>qr||r<ql){
		return;
	}
	if(qr>=r&&ql<=l){
		tree[p].val=max(tree[p].val,k);
		return;
	}
	int mid=l+r>>1;
	update(l,mid,ql,qr,ls(p),k);
	update(mid+1,r,ql,qr,rs(p),k);
	pushup(p);
}
inline int query(int l,int r,int ql,int qr,int p){
	if(l>qr||r<ql)return 0;
	if(qr>=r&&ql<=l){
		return tree[p].val;
	}
	if(l==r)return tree[p].val;
	int mid=l+r>>1;
	return max(query(l,mid,ql,qr,ls(p)),query(mid+1,r,ql,qr,rs(p)));
}
signed main(){
	int m;
	cin>>m>>mod;
	int t=0;
	while(m--){
		char op;
		cin>>op;
		if(op=='Q'){
			int l;
			cin>>l;
			t=query(1,p,p-l+1,p,1);
//			cout<<p-l+1<<" "<<p<<endl;
			cout<<query(1,p,p-l+1,p,1)<<endl;
		}
		else{
			int n;
			cin>>n;
			n+=t;
			p++;
			update(1,p,p,p,1,n%mod);
		}
		//for(int i=1;i<=4*p;i++){
	//		cout<<tree[p].val<<" ";
	//	} 
		cout<<endl;
	}
	return 0;
}

2024/1/28 21:46
加载中...