思路
改一下线段树的模板就行了。每次添加数的时候len+1,查询区间是[len-L+1,len]。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 7;
char ch;
int x, m, mod, a = 0, tr[maxn << 2];
void add(int p, int l, int r, int pos, int x) {
if (l == r) {
tr[p] = (x + a + mod) % mod;
return;
}
int mid = l + r >> 1;
if (pos <= mid)
add(p << 1, l, mid, pos, x);
else
add(p << 1 | 1, mid + 1, r, pos, x);
tr[p] = max(tr[p << 1], tr[p << 1 | 1]);
}
int query(int p, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr)
return tr[p];
int mid = l + r >> 1, res = 0;
if (ql <= mid)
res = max(res, query(p << 1, l, mid, ql, qr));
if (qr > mid)
res = max(res, query(p << 1 | 1, mid + 1, r, ql, qr));
return res;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> m >> mod;
memset(tr, 0, sizeof(tr));
int len = 0;
for (int i = 1; i <= m; i++) {
cin >> ch >> x;
if (ch == 'A') {
add(1, 1, m, len + 1, x);
len++;
}
if (ch == 'Q') {
a = query(1, 1, m, len - x + 1, len);
cout << a << endl;
}
// for(int i=1;i<=4*len;i++) cout<<tr[i]<<" ";
}
return 0;
} 
京公网安备 11010502036488号