线段树20pts,求助
查看原帖
线段树20pts,求助
378915
zhoujiefu楼主2024/11/27 20:40
#include<bits/stdc++.h>
#define int long long
#define ls i<<1
#define rs i<<1|1
using namespace std;
const int N=2e5+5;
const int inf=9e18;
struct node{
	int maxn,l,r,tag;
}t[N<<2];
int q,mod,lstans,n;

void build(int i,int l,int r){
	t[i]={-inf,l,r,0};
	if(l==r) return;
	int mid=l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
}

void pd(int i){
	t[ls].tag=(t[ls].tag+t[i].tag)%mod;
	t[rs].tag=(t[rs].tag+t[i].tag)%mod;
	t[ls].maxn=(t[ls].maxn+t[i].tag)%mod;
	t[rs].maxn=(t[rs].maxn+t[i].tag)%mod;
	t[i].tag=0;
}

void add(int i,int l,int r,int x){
	if(l<=t[i].l&&t[i].r<=r){
		t[i].tag=(t[i].tag+x)%mod;
		t[i].maxn=(t[i].maxn+x)%mod;
		return;
	}
	pd(i);
	int mid=t[i].l+t[i].r>>1;
	if(l<=mid) add(ls,l,r,x);
	if(r>=mid+1) add(rs,l,r,x);
	t[i].maxn=max(t[ls].maxn,t[rs].maxn);
}

int query(int i,int l,int r){
	if(l<=t[i].l&&t[i].r<=r){
		return t[i].maxn;
	}
	pd(i);
	int mid=t[i].l+t[i].r>>1;
	int ans=-inf;
	if(l<=mid) ans=max(ans,query(ls,l,r));
	if(r>=mid+1) ans=max(ans,query(rs,l,r));
	return ans;
}

signed main(){
	cin>>q>>mod;
	build(1,1,q);
	while(q--){
		char op;cin>>op;
		if(op=='Q'){
			int l;
			cin>>l;
			lstans=query(1,n-l+1,n);
			cout<<lstans<<'\n';
		}else{
			int x;
			cin>>x;
			++n;
			add(1,n,n,(lstans+x)%mod);
		}
	}
	return 0;
}
2024/11/27 20:40
加载中...