Submission #1329618

#TimeUsernameProblemLanguageResultExecution timeMemory
1329618itsKiaRashFood Court (JOI21_foodcourt)C++20
0 / 100
1096 ms21176 KiB
#include <bits/stdc++.h>
using namespace std;
// #include <ext/pb_ds/tree_policy.hpp>
// #include <ext/pb_ds/assoc_container.hpp>
// using namespace __gnu_pbds; // find_by_order   order_of_key
// template<class T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long ll;
typedef long double ld;
// #pragma GCC optimize ("O2,unroll-loops")
// #pragma GCC optimize ("Ofast")
// #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#define int ll
#define FAST_IO ios_base::sync_with_stdio(false), cin.tie(NULL);
#define file_init freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
#define testc int ttt;cin>>ttt;while(ttt--)
#define alll(x)	(x).begin(),(x).end()
#define pqi priority_queue<pii, vector<pii>, greater<pii>>
#define kill(x)  cout << x << '\n', exit(0)
#define rep(x) cerr<<"report: "<<x<<endl;
#define endl '\n'
#define pb push_back
#define ins insert
#define pii pair<int, int>
#define ff first
#define ss second
#define bg begin
#define rbg rbegin
#define sz size()
#define mset(x,y) memset(x,y,sizeof(x))
#define clr clear()
#define YES cout<<"YES"<<endl
#define NO cout<<"NO"<<endl
#define vci vector<int>
#define sti set<int>
#define nl cout<<endl
#define upb upper_bound
#define lrb lower_bound
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll gcd(ll a, ll b) { if (b == 0) return a; return gcd(b, a % b);}
ll lcm(ll a, ll b) { return (a * b) / gcd(a, b); }
const ll inf = (ll)1e18 + 18;
const int maxn = 3e5 + 7, mod = 1e9 + 7;
int n, m, q;
#define lc id*2
#define rc id*2+1
struct node{
    int val = 0, lz = 0, mn = 0, mx = 0;
    bool flag = false;
} seg[maxn<<2];

void fix(int id,int L,int R){
    seg[id].lz = seg[id].mn = seg[id].mx = seg[id].val = 0;
    seg[id].flag = true;
}
void addd(int id,int L,int R,int x){
    seg[id].lz += x; seg[id].mn += x; seg[id].mx += x;
    seg[id].val += x * (R - L + 1);
}

void relax(int id, int L, int R){
    // rep(id);
    int mid = L + R >> 1;
    if(seg[id].flag){
        fix(lc, L, mid); fix(rc, mid + 1, R);
        seg[id].flag = false;
    }
    if(seg[id].lz){
        int x = seg[id].lz;
        addd(lc, L, mid, x); addd(rc, mid + 1, R, x);
        seg[id].lz = 0;
    }
}
int get(int id, int L, int R, int l, int r){
    if(L > r || R < l || R < L) return 0;
    if(L != R && (seg[id].lz || seg[id].flag)) relax(id, L, R);
    if(L >= l && R <= r){
        return seg[id].val;
    }
    int mid = L + R >> 1;
    return get(lc, L, mid, l, r) + get(rc, mid + 1, R, l, r);
}
void add(int id, int L, int R, int l, int r, int x){
    if(L > r || R < l || R < L) return;
    if(L != R && (seg[id].lz != 0 || seg[id].flag)) relax(id, L, R);
    if(L >= l && R <= r){
        addd(id, L, R, x);
        return;
    }
    int mid = L + R >> 1;
    add(lc, L, mid, l, r, x); add(rc, mid + 1, R, l, r, x);
    seg[id].val = seg[lc].val + seg[rc].val;
    seg[id].mn = min(seg[lc].mn, seg[rc].mn);
    seg[id].mx = max(seg[lc].mx, seg[rc].mx);
}

void rem(int id, int L, int R, int l, int r, int k){
    if(L > r || R < l || R < L) return;
    if(L != R && (seg[id].lz != 0 || seg[id].flag)) relax(id, L, R);
    if(L >= l && R <= r){
        if(seg[id].mx <= k){
            fix(id, L, R);
            return;
        }
        if(seg[id].mn >= k){
            addd(id, L, R, -k);
            return;
        }
    }
    if(L == R){
        int cur = seg[id].val; int nxt = max(0ll, cur - k);
        seg[id].val = nxt; seg[id].mn = seg[id].mx = nxt; seg[id].lz = seg[id].flag = 0;
        return;
    }
    int mid = (L + R) >> 1;
    rem(lc, L, mid, l, r, k);
    rem(rc, mid + 1, R, l, r, k);
    seg[id].val = seg[lc].val + seg[rc].val;
    seg[id].mn = min(seg[lc].mn, seg[rc].mn);
    seg[id].mx = max(seg[lc].mx, seg[rc].mx);
}

int32_t main(){
    FAST_IO
    cin >> n >> m >> q ;
    while(q --){
        int t; cin >> t ;
        if(t == 1){
            int l, r, c, k; cin >> l >> r >> c >> k ;
            add(1, 1, n, l, r, k);
        }
        if(t == 2){
            int l, r, k; cin >> l >> r >> k ;
            rem(1, 1, n, l, r, k);
        }
        if(t == 3){
            int a, b; cin >> a >> b ;
            int cnt = get(1, 1, n, a, a);
            if(cnt >= b) cout << 1 << endl;
            else cout << 0 << endl;
        }
    }

    return 0;
}
#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...