제출 #1299414

#제출 시각아이디문제언어결과실행 시간메모리
1299414Tai_xiu푸드 코트 (JOI21_foodcourt)C++20
100 / 100
465 ms63480 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long
#define ll long long
#define Z int
#define i128 int128
#define ii pair<int,int>
#define ld long double
#define vi vector<int>
#define vvi vector<vi>
#define vii vector<pair<int,int>>
#define FOR(i,a,b) for (int i=a;i<=b;i++)
#define FOR1(i,a,b,c) for (int i=a;i<=b;i+=c)
#define REP(i,a,b) for (int i=a;i>=b;i--)
#define REP1(i,a,b,c) for(int i=b;i>=a;i-=c)
#define endh '\n';
#define len(a) ((Z)(a).size())
#define pb(c) push_back(c)
#define elif else if
#define ppb() pop_back()
#define rong std::npos
#define all(c) (c.begin(),c.end())
#define Z int
#define lcm(a,b) ((int) (a/__gcd(a,b))*b)
#define mk(a,b) make_pair(a,b)
#define fi first
#define se second
Z dx4[]= {-1,1,0,0};
Z dy4[]= {0,0,1,-1};
string co="YES",khong="NO";
const int mod=1e9+7;
const string NAME = "facttree";
const Z maxn = 250005;
const Z oo = 1e9;
struct stbeat
{
    vi ma1, ma2, maxc, sum, lazy;
    stbeat(){}
    stbeat(Z _n)
    {
        ma1 = ma2 = maxc = sum = lazy = vi (4 * _n + 7, 0);
    }
    void merge(Z v)
    {
        if (ma1[v * 2] == ma1[v *2  +1]){
            ma1[v] = ma1[v * 2];
            ma2[v] = max(ma2[v *2], ma2[ v * 2 + 1]);
            maxc[v] = maxc[v * 2] + maxc[v * 2 + 1];
        }
        else if (ma1[v * 2] > ma1[v *2 + 1]){
            ma1[v] = ma1[v * 2];
            ma2[v] = max(ma2[v * 2], ma1[v * 2 + 1]);
            maxc[v] = maxc[v * 2];
        }
        else{
            ma1[v] = ma1[v * 2 + 1];
            ma2[v] = max(ma2[v * 2 + 1], ma1[v * 2]);
            maxc[v] = maxc[v *2 + 1];
        }
        sum[v] = sum[v * 2] + sum[v * 2 + 1];
    }
    void pushmin(Z v, Z val)
    {
        if (ma1[v] <= val) return;
        sum[v] -= maxc[v] * ma1[v];
        ma1[v] = val;
        sum[v] += maxc[v] * ma1[v];
    }
    void pushadd(Z v, Z tl, Z tr, Z val)
    {
        if (val == 0) return;
        sum[v] += (tr - tl + 1) * val;
        ma1[v] += val;
        if (ma2[v] != -oo) ma2[v] += val;
        lazy[v] += val;
    }
    void push(Z v, Z tl, Z tr)
    {
        Z tm = tl + tr >> 1;
        pushadd(v * 2, tl, tm,  lazy[v]);
        pushadd(v * 2 + 1, tm + 1, tr, lazy[v]);

        pushmin(v * 2, ma1[v]);
        pushmin(v *2 + 1, ma1[v]);
        lazy[v] = 0;
    }
    void build(Z v, Z tl, Z tr)
    {
        if (tl == tr){
            sum[v] = 0;
            maxc[v] = 1;
            ma1[v] = 0;
            ma2[v] = -oo;
            return;
        }
        Z tm = tl + tr >> 1;
        build(v * 2, tl, tm);
        build(v * 2 + 1, tm + 1, tr);
        merge(v);
    }
    void add(Z v, Z tl, Z tr, Z l, Z r, Z val)
    {
        if (tl > tr || l > r || tl > r || tr < l) return;
        if (tl >= l && tr <= r)
        {
            pushadd(v, tl, tr, val);
            return;
        }
        Z tm = tl + tr >> 1;
        push(v, tl, tr);
        add (v *2 ,tl, tm, l, r, val);
        add(v *2 + 1, tm + 1 ,tr, l, r, val);
        merge(v);
    }
    void chmin(Z v, Z tl, Z tr, Z l, Z r, Z val)
    {
        if (tl > tr || l > r || tl > r || tr < l || ma1[v] <= val) return;
        if (tl >= l && tr <= r && ma2[v] < val){
            pushmin(v, val);
            return;
        }
        push(v, tl, tr);
        Z tm = tl + tr >> 1;
        chmin(v * 2, tl ,tm, l, r, val);
        chmin(v * 2 + 1, tm + 1, tr, l, r, val);
        merge(v);
    }
    Z query(Z v, Z tl, Z tr, Z l, Z r)
    {
        if (tl > tr || l > r || tl > r || tr < l ) return 0;
        if (tl >= l && tr <= r) return sum[v];
        Z tm = tl + tr >> 1;
        push(v, tl, tr);
        return query(v * 2, tl, tm, l, r) + query(v * 2 + 1, tm + 1, tr, l, r);
    }
};
struct bit
{
    vi arr;
    Z n;
    bit(){}
    bit(Z _n)
    {
        n = _n;
        arr = vi ( _n + 7, 0);
    }
    void update(Z i, Z val)
    {
        for (;i <= n ; i += (i & - i)){
            arr[i] += val;
        }
    }
    Z query(Z i){
        Z ans = 0;
        for (;i ; i&= (i - 1)) ans += arr[i];
        return ans;
    }
};
Z n, m, q;
array<Z, 4> add[maxn];
Z L[maxn], R[maxn], bound[maxn], vt[maxn], ans[maxn];
vi g[maxn];
Z id = 0, cc = 0;
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n >> m >> q;
    stbeat st1(n);
    st1.build(1, 1, n);
    bit bit1(n);
    FOR(i, 1, q){
        Z type, l, r, c, k;
        ans[i] = -1;
        cin >> type;
        if (type == 1){
            cin >> l >> r >> c >> k;
            st1.add(1, 1, n, l, r, -k);
            bit1.update(l, k);
            bit1.update(r + 1, -k);
            add[++ id] = {l, r, c, k};

        }
        else if (type == 2){
            cin >> l >> r >> k;
            st1.add(1, 1, n, l, r, k);
            st1.chmin(1, 1, n, l, r, 0);
        }
        else{
            Z idx, w;
            cin >> idx >> w;
            Z val  =  bit1.query(idx) + w +  st1.query(1, 1, n, idx, idx);
//            cout << val << " "<< bit1.query(idx)<<" "<< st1.query(1, 1, n, idx, idx) << '\n';
            ans[i] = 1;
            if (val > bit1.query(idx) ) {
                ans[i] = 0;
            }
            else{
                L[i] = 1;
                R[i] = id;
                bound[i] = val;
                vt[i] = idx;
            }
        }
    }
//    FOR(i, 1, id){
//        cout << add[i][0] <<" "<< add[i][1] <<" " << add[i][2] <<" "<<add[i][3] << '\n';
//    }
//    FOR(i, 1, q) cout << bound[i] <<"\n";
//    cout << id << '\n';
    FOR(i, 0, 20){
        FOR(j, 1, id) g[j].clear();
        FOR(j, 1, n) bit1.arr[j] = 0;
        FOR(j, 1, q){
            if (R[j] && L[j] <= R[j]) {
                g[(L[j] + R[j]) / 2].pb(j);
            }
        }
        FOR(j, 1, id){
            bit1.update(add[j][0], add[j][3]);
            bit1.update(add[j][1] + 1, -add[j][3]);
//            FOR(k, 1, n) cout <<bit1.query(k) <<" ";
//            cout << '\n';
            for (Z vitri : g[j]){
                if (bit1.query(vt[vitri]) >= bound[vitri]) R[vitri] = j - 1;
                else L[vitri] = j + 1;
            }
        }
    }
    FOR(i, 1, q){
        if (ans[i] == -1) continue;
//        if ( L[i] == 0){
//            continue;
//        }
        if (ans[i] == 0) cout << 0 << '\n';
        else {
            cout << add[ R[i] + 1][2] << '\n';
        }
    }
//    freopen((NAME + ".inp").c_str(),"r", stdin);
//    freopen((NAME + ".out").c_str(),"w", stdout);
}


#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...