rt,有没有大佬给个Hack数据啊啊啊,还是我题目理解错了,望大佬指出错误。
代码如下:
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair <int,int> PII;
const int dx[] = {1,-1,0,0},dy[] = {0,0,1,-1};
bool LAST = false;
istream& operator >> (istream& in,char* s) {
if (LAST) exit (0);
char ch = cin.get ();
while ((isspace (ch) || ch == '\n') && ch != EOF) ch = cin.get ();
int n = 0;
while (!(isspace (ch) || ch == '\n') && ch != EOF) s[n++] = ch,ch = cin.get ();
s[n] = '\0';
if (ch == EOF) LAST = true;
return in;
}
const int N = 100010,MOD = 1e9 + 9;
int n,q;
int a[N];
struct segment_tree_node {
int l,r;
int val;
LL sum;
int tag;
}tr[4 * N];
void push_up (int u) {
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
void opt_tag (int u,int d) {
if (!tr[u].val) tr[u].sum += d * 2;
else tr[u].sum += d;
tr[u].val = max (tr[u].val - d,0);
tr[u].tag += d;
}
void push_down (int u) {
if (tr[u].tag) {
opt_tag (u << 1,tr[u].tag),opt_tag (u << 1 | 1,tr[u].tag);
tr[u].tag = 0;
return ;
}
}
void build_segment_tree (int u,int l,int r) {
tr[u] = {l,r,a[l],0,0};
if (l == r) return ;
int mid = l + r >> 1;
build_segment_tree (u << 1,l,mid),build_segment_tree (u << 1 | 1,mid + 1,r);
}
void modify (int u,int l,int r,int d) {
if (l <= tr[u].l && tr[u].r <= r) {
opt_tag (u,d);
return ;
}
push_down (u);
int mid = tr[u].l + tr[u].r >> 1;
if (l <= mid) modify (u << 1,l,r,d);
if (r >= mid + 1) modify (u << 1 | 1,l,r,d);
push_up (u);
}
LL query (int u,int x) {
if (tr[u].l == tr[u].r) return tr[u].sum;
push_down (u);
int mid = tr[u].l + tr[u].r >> 1;
if (x <= mid) return query (u << 1,x);
return query (u << 1 | 1,x);
}
int main () {
cin >> n >> q;
for (int i = 1;i <= n;i++) cin >> a[i];
build_segment_tree (1,1,n);
LL ans = 0;
while (q--) {
char op;
cin >> op;
if (op == 'A') {
int l,r,x;
cin >> l >> r >> x;
modify (1,l,r,x);
}
else {
int x;
cin >> x;
ans += query (1,x);
}
}
cout << ans % MOD << endl;
return 0;
}