已经是全开Longlong了,inf也设置了,不知道哪里出了问题.
#include<cstdio>
#include<climits>
#include<iostream>
#include<algorithm>
using namespace std;
long long n, q;
long long a[8000005];
long long max(long long x, long long y)
{
return x > y ? x : y;
}
struct node
{
long long l;
long long r;
long long value;
long long lazy_add;
long long lazy_change;
bool change;
}t[40000020];
void build(long long l, long long r, long long node_index)
{
t[node_index].l = l;
t[node_index].r = r;
if (l == r)
{
t[node_index].value = a[l];
return;
}
long long mid = l + ((r - l) >> 1);
build(l, mid, node_index * 2);
build(mid + 1, r, node_index * 2 + 1);
t[node_index].value = max(t[node_index * 2].value, t[node_index * 2 + 1].value);
}
void spread(long long node_index)
{
//下放标记时先考虑change操作 再考虑add操作
//需要配合update函数修改的语句顺序
if (t[node_index].change || t[node_index].lazy_add)
{
if (t[node_index].change)
{
t[node_index * 2].change = 1;
t[node_index * 2].lazy_change = t[node_index].lazy_change;
t[node_index * 2 + 1].change = 1;
t[node_index * 2 + 1].lazy_change = t[node_index].lazy_change;
t[node_index * 2].value = t[node_index].lazy_change;
t[node_index * 2 + 1].value = t[node_index].lazy_change;
t[node_index].change = 0;
t[node_index * 2].lazy_add = 0;
t[node_index * 2 + 1].lazy_add = 0;
}
t[node_index * 2].lazy_add += t[node_index].lazy_add;
t[node_index * 2 + 1].lazy_add += t[node_index].lazy_add;
t[node_index * 2].value += t[node_index].lazy_add;
t[node_index * 2 + 1].value += t[node_index].lazy_add;
t[node_index].lazy_add = 0;
}
}
void update_change(long long l, long long r, long long node_index, long long value)
{
long long node_l = t[node_index].l;
long long node_r = t[node_index].r;
if (l <= node_l && r >= node_r)
{
t[node_index].lazy_add = 0;
t[node_index].change = 1;
t[node_index].lazy_change = value;
t[node_index].value = value;
return;
}
spread(node_index);
long long mid = node_l + ((node_r - node_l) >> 1);
if (l <= mid) update_change(l, r, node_index * 2, value);
if (r > mid) update_change(l, r, node_index * 2 + 1, value);
t[node_index].value = max(t[node_index * 2].value, t[node_index * 2 + 1].value);
}
void update_add(long long l, long long r, long long node_index, long long value)
{
long long node_l = t[node_index].l;
long long node_r = t[node_index].r;
spread(node_index);
if (l <= node_l && r >= node_r)
{
t[node_index].lazy_add += value;
//t[node_index].lazy_change = value;
t[node_index].value += value;
return;
}
long long mid = node_l + ((node_r - node_l) >> 1);
if (l <= mid) update_add(l, r, node_index * 2, value);
if (r > mid) update_add(l, r, node_index * 2 + 1, value);
t[node_index].value = max(t[node_index * 2].value, t[node_index * 2 + 1].value);
}
long long query(long long l, long long r, long long node_index)
{
long long node_l = t[node_index].l;
long long node_r = t[node_index].r;
if (node_l >= l && node_r <= r)
{
return t[node_index].value;
}
spread(node_index);
long long result = LLONG_MIN;
long long mid = node_l + ((node_r - node_l) >> 1);
if (l <= mid) result = max(result, query(l, r, node_index * 2));
if (r > mid) result = max(result, query(l, r, node_index * 2 + 1));
return result;
}
int main()
{
//long long T = LLONG_MIN;
//printf("%lld",T);
scanf("%d %d", &n, &q);
for (int i = 1; i <= n; i++) scanf("%d",&a[i]);
build(1, n, 1);
int flag;
long long l, r, x;
for (int i = 1; i <= q; i++)
{
scanf("%d", &flag);
switch (flag)
{
case 1:
scanf("%lld %lld %lld",&l,&r,&x);
update_change(l, r, 1, x);
break;
case 2:
scanf("%lld %lld %lld",&l,&r,&x);
update_add(l, r, 1, x);
break;
case 3:
scanf("%lld %lld",&l,&r);
printf("%lld\n", query(l, r, 1));
break;
}
}
return 0;
}