题目:https://www.luogu.com.cn/problem/U199651
这个是我自己的题目,我用线段树造的数据,但是暴力+O2
在限时 1s 下不超时却 WA
了,是不是我线段树打错了?
线段树:
#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
const int N = 1e5 + 5;
int n, v, xk;
struct Node
{
int l, r, sum;
};
Node tree[N << 2];
void push_up(int u)
{
tree[u].sum = tree[u << 1].sum + tree[u << 1 | 1].sum;
}
void build(int u, int l, int r)
{
tree[u] = { l, r, xk };
if (l == r) return;
int mid = (l + r) >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
push_up(u);
}
void modify(int u, int x, int y)
{
if (tree[u].l == x && tree[u].r == x) tree[u].sum += y;
else
{
int mid = (tree[u].l + tree[u].r) >> 1;
if (x <= mid) modify(u << 1, x, y);
else modify(u << 1 | 1, x, y);
push_up(u);
}
}
int query(int u, int l, int r)
{
if (tree[u].l >= l && tree[u].r <= r) return tree[u].sum;
int mid = (tree[u].l + tree[u].r) >> 1, ans = 0;
if (l <= mid) ans += query(u << 1, l, r);
if (r > mid) ans += query(u << 1 | 1, l, r);
return ans;
}
signed main()
{
scanf("%lld %lld %lld", &n, &xk, &v);
build(1, 1, n);
while (v--)
{
char ch;
int a, b;
cin >> ch >> a >> b;
if (ch == 'x') modify(1, a, b);
else
{
printf("%lld\n", query(1, a, b));
}
}
return 0;
}