제출 #1351188

#제출 시각아이디문제언어결과실행 시간메모리
1351188njoopGrowing Trees (BOI11_grow)C++17
100 / 100
536 ms7940 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

int n, m;

struct sgt {
    int n;
    vector<int> seg, lazy;

    void init(int sz) {
        n = sz;
        seg.assign(4*n+10, 0);
        lazy.assign(4*n+10, 0);
    }

    void push(int l, int r, int node) {
        if(lazy[node] == 0) return;
        seg[node] += (r-l+1)*lazy[node];
        if(l != r) {
            lazy[node*2+1] += lazy[node];
            lazy[node*2+2] += lazy[node];
        }
        lazy[node] = 0;
    }

    void update(int l, int r, int idl, int idr, int val, int node) {
        push(l, r, node);
        if(l > idr || r < idl) return;
        if(idl <= l && r <= idr) {
            lazy[node] += val;
            push(l, r, node);
            return;
        }
        int mid = (l+r)/2;
        update(l, mid, idl, idr, val, node*2+1);
        update(mid+1, r, idl ,idr, val, node*2+2);
        seg[node] = seg[node*2+1] + seg[node*2+2];
    }

    int query(int l, int r, int ql, int qr, int node) {
        push(l, r, node);
        if(l > qr || r < ql) return 0;
        if(l >= ql && r <= qr) return seg[node];
        int mid = (l+r)/2;
        return query(l, mid, ql, qr, node*2+1) + query(mid+1, r, ql, qr, node*2+2);
    }

    void upd(int idl, int idr, int val) {
        update(0, n, idl, idr, val, 0);
    }

    int qry(int ql, int qr) {
        return query(0, n, ql, qr, 0);
    }
};

sgt seg;

int ubound(int val) {
    int l=1, r=n;
    if(val < seg.qry(1, 1)) return 0;
    if(val > seg.qry(n, n)) return -1;
    while(l < r) {
        int mid = (l+r)/2;
        if(seg.qry(mid, mid) <= val) l = mid+1;
        else r = mid;
    }
    if(seg.qry(l, l) <= val) return l;
    return l-1;
}

int lbound(int val) {
    int l=1, r=n;
    if(val < seg.qry(1, 1)) return 0;
    if(val > seg.qry(n, n)) return -1;
    while(l < r) {
        int mid = (l+r)/2;
        if(seg.qry(mid, mid) < val) l = mid+1;
        else r = mid;
    }
    return l;
}
signed main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> m;
    seg.init(n);
    vector<int> v;
    for(int i=1; i<=n; i++) {
        int in;
        cin >> in;
        v.push_back(in);
    }
    sort(v.begin(), v.end());
    for(int i=1; i<=n; i++) {
        seg.upd(i, i, v[i-1]);
    }
    while(m--) {
        char t;
        int c, h;
        cin >> t >> c >> h;
        if(t == 'F') {
            int l = lbound(h), r, idx, val;
            if(l == -1) continue;
            if(l == 0) l++;
            r = l+c-1;
            if(r >= n) {
                seg.upd(l, n, 1);
                continue;
            }
            val = seg.qry(r, r);
            if(val != seg.qry(l, l)) {
                int tidx = ubound(val-1);
                seg.upd(l, tidx, 1);
                c -= tidx-l+1;
            }
            if(c == 0) continue;
            idx = ubound(val);
            seg.upd(idx-c+1, idx, 1);
        } else {
            int l = lbound(c), r = ubound(h);
            if(l == -1 || r == 0) {
                cout << "0\n";
                continue;
            }
            if(r == -1) r = n;
            if(l == 0) l = 1;
            cout << r-l+1 << "\n";
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...