Submission #1332133

#TimeUsernameProblemLanguageResultExecution timeMemory
1332133thelegendary08Food Court (JOI21_foodcourt)C++17
68 / 100
1096 ms48308 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;
const int mxn = 250005; 
vector<pii>w[mxn], r[mxn];int mn[mxn*4],mx[mxn*4],lzadd[mxn*4]; bool lzrs[mxn*4];
int n,m,q; 
struct segtree{
	int n; //vi mn, mx, lzrs, lzadd, tl, tr; 
	
	segtree(int x){
		n=x; //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);
	}
	void pull(int v){
		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]=lzadd[v]=0; 
	}
	void add(int v, int x){ 
		lzadd[v]+=x; mn[v]+=x; mx[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){
		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 tl, int tr, int l, int r, int x){
		if(tl > r || tr < l)return; if(tl >= l && tr <= r){
			if(mn[v] + x >= 0){add(v,x);return;}
			if(mx[v] + x <= 0){reset(v);return;}
		}
		push(v);int tm = tl + tr >> 1; update(v*2,tl,tm,l,r,x);update(v*2+1,tm+1,tr,l,r,x);pull(v);
	}
	int get(int v, int tl, int tr, int x){
		if(tl==tr){return mn[v];} push(v); int tm = tl + tr >> 1; if(tm >= x)return get(v*2,tl,tm,x); else return get(v*2+1,tm+1,tr,x);
	}
};
struct tseg{
	int n; vi sum; 
	tseg(int x){
		n=x; sum.resize(4*n+5);
	}
	void update(int v, int tl, int tr, int l, int r, int x){
		if(tl>=l&&tr<=r){sum[v]+=x;return;} if(tl>r||tr<l)return;
		int tm = tl + tr >> 1; update(v*2,tl,tm,l,r,x); update(v*2+1,tm+1,tr,l,r,x);
	}
	int get(int v, int tl, int tr, int k){
		if(tl==tr)return sum[v]; int tm = tl + tr >> 1; if(k <= tm)return sum[v] + get(v*2,tl,tm,k); else return sum[v] + get(v*2+1,tm+1,tr,k);
	}
};
struct useg{
	int n; vi sum; 
	useg(int x){
		n = x; sum.resize(4*n+5); 
	}
	void pull(int v){sum[v]=sum[v*2]+sum[v*2+1];}
	void update(int v, int tl, int tr, int k, int x){
		if(tl==tr){sum[v]+=x; return;} int tm = tl + tr >> 1; if(k <= tm)update(v*2,tl,tm,k,x); else update(v*2+1,tm+1,tr,k,x); pull(v);
	}
	int get_first(int v, int tl, int tr, int x){
		if(sum[v] < x)return -1; if(tl==tr)return tl; 
		int tm = tl + tr >> 1; if(sum[v*2] >= x)return get_first(v*2, tl, tm, x); else return get_first(v*2+1, tm+1, tr, x - sum[v*2]);
	}
};
struct query{
	int op, l, r, x, y, id; 
};
signed main(){
	cin>>n>>m>>q; int Q = 0, R = 0; segtree S = segtree(n); tseg T = tseg(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++; cs.pb(c); S.update(1,0,n-1,l,r,k); T.update(1,0,n-1,l,r,k);
			w[l].pb(mp(Q-1, k)); w[r+1].pb(mp(Q-1, -k));
		}
		else if(op == 2){
			int l, r, k; cin>>l>>r>>k; l--;r--; S.update(1,0,n-1,l,r,-k);
		}
		else{
			int x, y; cin>>x>>y; x--; int sc = S.get(1,0,n-1,x), tc = T.get(1,0,n-1,x); 
			if(sc < y)r[x].eb(-1,R); else r[x].eb(tc - sc + y, R); R++; 
		}
	}
	vi ans(R); useg U = useg(Q); f0r(i,n){
		for(auto [x,y] : w[i])U.update(1,0,Q-1,x,y); for(auto [x, id] : r[i]){
			if(x==-1)continue; int d = U.get_first(1, 0, Q-1, x); ans[id] = cs[d]; 
		}
	} for(auto u : ans)cout<<u<<'\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...