萌新求助线段树二分
查看原帖
萌新求助线段树二分
155767
Tarsal楼主2020/11/25 00:26

救救孩子!

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define ls (x << 1)
#define rs (x << 1 | 1)
#define mid (l + r >> 1)
#define Rep(x, a, b) for(int x = a; x <= b; ++ x)
#define Dep(x, a, b) for(int x = a; x >= b; -- x)
#define Next(i, x) for(int i = head[x]; i; i = edge[i].nxt)
int read() {
    char c = getchar(); int f = 1, x = 0;
    while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); }
    while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
    return x * f;
}
const int maxn = 2e5 + 10;
int a[maxn], sum[maxn << 2], _min[maxn << 2], lazy[maxn << 2];
void Build(int x, int l, int r) {
    if(l == r) { sum[x] = _min[x] = a[l]; return ;}
    Build(ls, l, mid), Build(rs, mid + 1, r);
    sum[x] = sum[ls] + sum[rs]; _min[x] = min(_min[ls], _min[rs]);
}
void pushdown(int x, int l, int r) {
    sum[ls] = lazy[x] * (mid - l + 1);
    sum[rs] = lazy[x] * (r - mid);
    _min[ls] = _min[rs] = lazy[ls] = lazy[rs] = lazy[x];
    lazy[x] = 0;
}
void Modify(int x, int l, int r, int L, int R, int k) {
    if(l >= L && r <= R) { sum[x] = k * (r - l + 1), lazy[x] = _min[x] = k; return ;}
    pushdown(x, l, r);
    if(mid >= L) Modify(ls, l, mid, L, R, k);
    if(mid < R) Modify(rs, mid + 1, r, L, R, k);
    sum[x] = sum[ls] + sum[rs]; _min[x] = min(_min[ls], _min[rs]);
}
int Lower_bound(int x, int l, int r, int k) {
    if(l == r) return l; pushdown(x, l, r);
    if(_min[ls] > k) Lower_bound(ls, l, mid, k);
    else Lower_bound(rs, mid + 1, r, k);
}
int Sum(int x, int l, int r, int L, int R) {
    if(l >= L && r <= R) return sum[x];
    pushdown(x, l, r); int ans = 0;
    if(l >= L) ans += Sum(ls, l, mid, L, R);
    if(r < R) ans += Sum(rs, mid + 1, r, L, R);
}
int Query(int x, int l, int r, int &k) {
    if(sum[x] <= k) { k -= sum[x]; return r - l + 1; }
    if(l == r) return 0; pushdown(x, l, r); int ans = 0;
    if(_min[ls] <= k) ans += Query(ls, l, mid, k);
    if(_min[rs] <= k) ans += Query(rs, mid + 1, r, k);
    return ans;
}
signed main() { int n = read(), m = read();
    Rep(i, 1, n) a[i] = read(); Build(1, 1, n);
    Rep(i, 1, m) { int opt = read(), x = read(), y = read();
        if(opt == 1) Modify(1, 1, n, Lower_bound(1, 1, n, y), x, y);
        else {
            if(x > 1) y += Sum(1, 1, n, 1, x - 1);
            printf("%d %d\n", y, Query(1, 1, n, y) - x + 1);
        }
    }
    return 0;
}
/*
10 1
10 10 10 6 6 5 5 5 3 1
2 3 50
*/
2020/11/25 00:26
加载中...