STL爆炸了!
查看原帖
STL爆炸了!
1334925
The_foolishest_OIer楼主2024/8/6 09:56
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <iomanip>
#include <string>
#include <map>
#include <stack>
#include <stdio.h>
#include <cstring>
using namespace std;
const int maxn = 2e5 * 4 + 100;
const int maxn2 = 2e5 + 100;
long long a[maxn2],sum[maxn],m,d,x,t,cnt,e,f;
char opt;
void build (int o,int l,int r){
	if (l == r) sum[o] = a[l];
	else{
		long long mid = l + (r - l) / 2;
		build (o * 2,l,mid);
		build (o * 2 + 1,mid + 1,r);
		sum[o] = sum[o * 2] + sum[o * 2 + 1];
	}
}
void update (int o,int l,int r){
	if (l == r){
		sum[o] += t;
		sum[o] %= d;
		t = sum[o];
	}else{
		long long mid = l + (r - l) / 2;
		if (x <= mid) update (o * 2,l,mid);
		else update (o * 2 + 1,mid + 1,r);
		sum[o] = max(sum[o * 2],sum[o * 2 + 1]);
	}
}
void update2 (int o,int l,int r){
	if (l == r){
		sum[o] += t;
		sum[o] %= d;
		t = sum[o];
	}else{
		long long mid = l + (r - l) / 2;
		if (cnt <= mid) update (o * 2,l,mid);
		else update (o * 2 + 1,mid + 1,r);
		sum[o] = max(sum[o * 2],sum[o * 2 + 1]);
	}
}
long long find(int o,int l,int r){
	if (e <= l && r <= f)
		return sum[o];
	long long ans = 0;
	long long mid = l + (r - l) / 2;
	long long aa = find(o * 2,l,mid);
	long long bb = find(o * 2 + 1,mid + 1,r);
	if (e <= mid) ans = max(ans,aa);
	if (f > mid) ans = max(ans,bb);
	return ans;
}
int main(){
	cin >> m >> d;
	build (1,1,maxn2);
	for (int i = 1 ; i <= m ; i++){
		cin >> opt >> x;
		if (opt == 'A'){
			update (1,1,maxn2);
			cnt++;
			update2 (1,1,maxn2);
		}else{
			e = cnt - x + 1;
			f = cnt;
			cout << find (1,1,maxn2) << endl;
		}
	}
	return 0;
}

不知道错哪了

2024/8/6 09:56
加载中...