제출 #1331338

#제출 시각아이디문제언어결과실행 시간메모리
1331338thelegendary08푸드 코트 (JOI21_foodcourt)C++17
0 / 100
1098 ms124316 KiB
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define vi vector<int>
#define pii pair<int,int>
#define F first
#define S second
#define f0r(i,n) for(int i = 0; i < n; i++)
#define FOR(i,k,n) for(int i = k; i < n; i++)
#define dout(x) cout<<x<<' '<<#x<<endl
#define dout2(x,y) cout<<x<<' '<<#x<<' '<<y<<' '<<#y<<endl
#define vout(v) for(auto u : v)cout<<u<<' '; cout<<endl
using namespace std;
int n,m,q; 
struct segtree{
	int n; vi sum, mn, mx, lzrs, lzadd, tl, tr; 
	segtree(int x){
		n=x; sum.resize(4*n+5);mn.resize(4*n+5);mx.resize(4*n+5);lzrs.resize(4*n+5);lzadd.resize(4*n+5);tl.resize(4*n+5);tr.resize(4*n+5);
		build(1,0,n-1);
	}
	int sz(int v){return tr[v]-tl[v]+1;}
	void pull(int v){
		sum[v]=sum[v*2]+sum[v*2+1]; mn[v]=min(mn[v*2],mn[v*2+1]); mx[v]=max(mx[v*2],mx[v*2+1]);
	}
	void reset(int v){
		lzrs[v]=1; mn[v]=mx[v]=sum[v]=lzadd[v]=0; 
	}
	void add(int v, int x){ 
		lzadd[v]+=x; mn[v]+=x; mx[v]+=x; sum[v]+=sz(v)*x; 
	}
	void push(int v){
		if(lzrs[v]){
			reset(v*2); reset(v*2+1); lzrs[v]=0; 
		}
		if(lzadd[v]){
			add(v*2,lzadd[v]); add(v*2+1,lzadd[v]); lzadd[v]=0;
		}
	}
	void build(int v, int l, int r){
		tl[v]=l, tr[v]=r; if(l==r){return;} int tm = l+r>>1; build(v*2,l,tm); build(v*2+1,tm+1,r);
	}
	void update(int v, int l, int r, int x){
		if(tl[v] > r || tr[v] < l)return; if(tl[v] >= l && tr[v] <= r){
			if(mn[v] + x >= 0){add(v,x);return;}
			if(mx[v] + x <= 0){reset(v);return;}
		}
		push(v);update(v*2,l,r,x);update(v*2+1,l,r,x);pull(v);
	}
	int get(int v, int x){
		if(tl[v]==tr[v]){return sum[v];} push(v); if(tr[v*2] >= x)return get(v*2,x); else return get(v*2+1,x);
	}
};
struct query{
	int op, l, r, x, y, id; 
};
signed main(){
	cin>>n>>m>>q; int Q = 0; vector<query>quers; segtree S = segtree(n), T = segtree(n); vi cs; f0r(i,q){
		int op; cin>>op; if(op==1){
			int l,r,c,k; cin>>l>>r>>c>>k; l--;r--; Q++; quers.pb({op,l,r,c,k,i}); cs.pb(c); S.update(1,l,r,k); //T.update(1,l,r,k);
		}
		else if(op == 2){
			int l, r, k; cin>>l>>r>>k; l--;r--; quers.pb({op,l,r,k,0,i}); S.update(1,l,r,-k);
		}
		else{
			int x, y; cin>>x>>y; x--; quers.pb({op,0,0,x,y,i}); if(S.get(1,x) >= y)cout<<1<<'\n'; else cout<<0<<'\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...