线段树
#define maxn 1000005
typedef long long ll;
ll a[maxn];
ll tree[maxn * 4];
ll lzy[maxn * 4];
int n, m, opt, ans = 0;
inline void refresh_tree(const int u)
{
tree[u] = tree[u << 1] + tree[(u << 1) + 1];
}
inline void made_tree(const int u, int L, int R)
{
if(L == R)
{
tree[u] = a[L];
return;
}
int mid = (L + R) >> 1;
made_tree(u << 1, L, mid);
made_tree((u << 1) + 1, mid+1, R);
refresh_tree(u);
}
inline ll find_point(int u, int L, int R, int p)
{
if(L == R)
return tree[u];
int mid = (L + R) >> 1;
if(p <= mid)
return find_point(u << 1, L, mid, p);
else
return find_point((u << 1) + 1, mid+1, R, p);
}
inline void change_point(int u, int L, int R, int p, ll x)
{
if(L == R)
{
tree[u] = x;
return ;
}
else
{
int mid = (L + R) >> 1;
if(p <= mid)
change_point(u << 1, L, mid, p, x);
else
change_point((u << 1) + 1, mid + 1, R, p, x);
refresh_tree(u);
}
}
inline bool In_range(int L, int R, int l, int r)
{
return (R <= r) && (L >= l);
}
inline bool Out_of_range(int L, int R, int l, int r)
{
return (R < l) || (L > r);
}
inline ll find_range(int u, int L, int R, int l, int r)
{
if(In_range(L, R, l, r))
return tree[u];
else if(!Out_of_range(L, R, l, r))
{
int mid = (L + R) >> 1;
return find_range(u << 1, L, mid, l, r) + find_range((u << 1) + 1, mid + 1, R, l, r);
}
else return 0;
}
inline void maketag(int u, int len, ll x)
{
lzy[u] += x;
tree[u] += len * x;
}
inline void push_down(int u, int L, int R)
{
int mid = (L + R) >> 1;
maketag(u << 1, mid - L + 1, lzy[u]);
maketag((u << 1) + 1, R - mid, lzy[u]);
lzy[u] = 0;
}
inline ll work(int u, int L, int R, int l, int r)
{
int mid = (L + R) / 2;
if(In_range(L, R, l, r))
return tree[u];
else if(!Out_of_range(L, R, l, r))
{
push_down(u, l, R);
return work(u << 1, L, mid, l, r) + work((u << 1) + 1, mid + 1, R, l, r);
}
else return 0;
}
inline void update(int u, int L, int R, int l, int r, ll x)
{
if(In_range(L, R, l, r))
maketag(u, R - L + 1, x);
else if(!Out_of_range(L, R, l, r))
{
int mid = (L + R) / 2;
push_down(u, L, R);
update(u << 1, L, mid, l, r, x);
update((u << 1) + 1, mid + 1, R, l, r, x);
refresh_tree(u);
}
}