题目链接
// Steins;Gate
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>
using namespace std;
using ll = long long;
#define INF 0x3f3f3f3f
#define lowbit(x) (x & -x)
#define jiasu ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define don(i, a, b) for (int i = (a); i >= (b); --i)
#define fori(i, a, b) for (int i = (a); i < (b); ++i)
#define endl '\n'
const int N = 1e6 + 10;
int n, m;
ll tr[N], val[N]; // val中存每种颜色的偏移量
set<int> s;
int R[N], color[N]; // 每段区间左端点对应的右端点, 每段区间的颜色
void add(int x, ll c) {
for (int i = x; i <= n; i += lowbit(i))
tr[i] += c;
}
void modify(int l, int r, ll c) {
add(l, c), add(r + 1, -c);
}
ll query(int x) {
ll ans = 0;
for (int i = x; i; i -= lowbit(i))
ans += tr[i];
return ans;
}
void change(int l, int r, int c) {
while (1) { // 先处理左端点在[l, r]内的区间
auto it = s.lower_bound(l);
if (*it > r)
break;
if (R[*it] > r) {
s.insert(r + 1);
R[r + 1] = R[*it];
color[r + 1] = color[*it];
modify(*it, r, val[color[*it]]); // 加上原来颜色的偏移量
s.erase(it);
} else {
modify(*it, R[*it], val[color[*it]]);
s.erase(it);
}
}
s.insert(l);
R[l] = r;
color[l] = c;
modify(l, r, -val[c]); // 变为颜色c, 要将颜色c之前的偏移量减去
auto it = s.lower_bound(l);
it--;
if (R[*it] >= l) {
if (R[*it] > r) {
modify(l, r, val[color[*it]]);
s.insert(r + 1);
R[r + 1] = R[*it];
color[r + 1] = color[*it];
R[*it] = l - 1;
} else {
modify(l, R[*it], val[color[*it]]);
R[*it] = l - 1;
}
}
}
signed main() {
jiasu;
cin >> n >> m;
s.insert(0), s.insert(n + 1), s.insert(1);
R[1] = n, color[1] = 1;
while (m--) {
string op;
cin >> op;
if (op[0] == 'C') {
int l, r, c;
cin >> l >> r >> c;
change(l, r, c);
} else if (op[0] == 'A') {
int c, x;
cin >> c >> x;
val[c] += x;
} else {
int x;
cin >> x;
auto it = s.upper_bound(x);
it--;
cout << query(x) + val[color[*it]] << endl; // 查询时加上当前颜色的偏移量
}
}
return 0;
}