rt,这代码本地运行不了……他不仅不生成数据,还让我输入……
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int rnd(int l, int r){
return 1LL * rand() * RAND_MAX * RAND_MAX % (r - l + 1) + l;
}
const int N = 1e5 + 10;
const int M = N << 2;
int n, q;
int ans[M], lans[M], rans[M];
ll h[N], tag[M], pl[M], pr[M];
struct node{
int res, lres, rres;
ll pl, pr;
};
#define ls(o) (o << 1)
#define rs(o) (o << 1 | 1)
void pushup(int o, int l, int r){
int mid = (l + r) >> 1;
pl[o] = pl[ls(o)], pr[o] = pr[rs(o)];
lans[o] = lans[ls(o)], rans[o] = rans[rs(o)];
if(lans[o] == (mid - l + 1) && max(pr[ls(o)], pl[rs(o)]) <= 2 * min(pr[ls(o)], pl[rs(o)]))
lans[o] += lans[rs(o)];
if(rans[o] == (r - mid) && max(pr[ls(o)], pl[rs(o)]) <= 2 * min(pr[ls(o)], pl[rs(o)]))
rans[o] += rans[ls(o)];
ans[o] = max(ans[ls(o)], ans[rs(o)]);
if(max(pr[ls(o)], pl[rs(o)]) <= 2 * min(pr[ls(o)], pl[rs(o)]))
ans[o] = max(ans[o], rans[ls(o)] + lans[rs(o)]);
}
void pushdown(int o){
pl[ls(o)] += tag[o], pl[rs(o)] += tag[o];
pr[ls(o)] += tag[o], pr[rs(o)] += tag[o];
tag[ls(o)] += tag[o], tag[rs(o)] += tag[o];
tag[o] = 0;
}
void build(int o, int l, int r){
if(l == r){
ans[o] = lans[o] = rans[o] = 1;
pl[o] = pr[o] = h[l];
return ;
}
int mid = (l + r) >> 1;
build(ls(o), l, mid);
build(rs(o), mid + 1, r);
pushup(o, l, r);
}
void update(int o, int l, int r, int s, int t, ll x){
if(l >= s && r <= t){
pl[o] += x, pr[o] += x;
tag[o] += x;
return ;
}
int mid = (l + r) >> 1;
pushdown(o);
if(s <= mid)
update(ls(o), l, mid, s, t, x);
if(t > mid)
update(rs(o), mid + 1, r, s, t, x);
pushup(o, l, r);
}
node query(int o, int l, int r, int s, int t){
if(l >= s && r <= t)
return (node){ans[o], lans[o], rans[o], pl[o], pr[o]};
int mid = (l + r) >> 1;
pushdown(o);
if(t <= mid)
return query(ls(o), l, mid, s, t);
if(s > mid)
return query(rs(o), mid + 1, r, s, t);
node p = query(ls(o), l, mid, s, t);
node q = query(rs(o), mid + 1, r, s, t);
node now;
now.pl = p.pl, now.pr = q.pr;
now.lres = p.lres, now.rres = q.rres;
if(now.lres == (mid - l + 1) && max(p.pr, q.pl) <= min(p.pr, p.pl) * 2)
now.lres += q.lres;
if(now.rres == (r - mid) && max(p.pr, q.pl) <= min(p.pr, p.pl) * 2)
now.rres += p.rres;
now.res = max(p.res, q.res);
if(max(p.pr, q.pl) <= min(p.pr, p.pl) * 2)
now.res = max(now.res, p.rres + q.lres);
return now;
}
int main(){
srand(time(0));
for(int T=1;T<=4;T++){
string in = "stair" + to_string(T) + ".in";
freopen(in.c_str(), "w", stdout);
n = rnd(10, 1000), q = rnd(10, 1000);
printf("%d %d\n", n, q);
for(int i=1;i<=n;i++)
printf("%d ", rnd(1, 10000));
for(int i=1;i<=q;i++){
int op = rnd(1, 2);
printf("%d ", op);
if(op == 1){
int l = rnd(1, n - 5), k = rnd(1, 10000);
printf("%d %d %d\n", l, rnd(l, n), k);
}else{
int l = rnd(1, n - 5);
printf("%d %d\n", l, rnd(l, n));
}
}
fclose(stdout);
string out = "stair" + to_string(T) + ".out";
freopen(in.c_str(), "r", stdin);
freopen(out.c_str(), "w", stdout);
scanf("%d%d", &n, &q);
for(int i=1;i<=n;i++)
scanf("%lld", &h[i]);
build(1, 1, n);
while(q--){
int op, l, r; ll k;
scanf("%d%d%d", &op, &l, &r);
if(op == 1){
scanf("%lld", &k);
update(1, 1, n, l, r, k);
}
else
printf("%d\n", query(1, 1, n, l, r).res);
}
}
}