제출 #1332756

#제출 시각아이디문제언어결과실행 시간메모리
1332756WH8Two Antennas (JOI19_antennas)C++17
22 / 100
427 ms86912 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define s second
#define pb push_back
#define sz(x) (int)x.size()
#define iii tuple<int,int,int>
#define pll pair<int,int>

struct node {
	int s, e, m;
	int c, d, ans, lz;
	node *l, *r;
	node (int S, int E){
		s=S, e=E, m=(S+E)/2, c=-1e18, d=1e18, ans=-1, lz=1e18;
		if(s!=e){
			l=new node(s, m);
			r=new node(m+1, e);
		}
	}
	void prop(){
		if(s==e or lz==1e18)return;
		if(l->c > 0){
			l->lz=min(l->lz, lz);
			l->ans=max(l->ans, l->c-lz);
		}
		if(r->c > 0) {
			r->lz=min(r->lz, lz);
			r->ans=max(r->ans, r->c-lz);
		}
		lz=1e18;
	}
	void set(int x, int v){
		if(s==e){
			c=v;
			//ans=max(ans, c-d);
			//printf("segment %lld to %lld, c %lld, d %lld, ans %lld\n", s,e,c,d,ans);
			return;
		}
		prop();
		if(x <= m)l->set(x, v);
		else r->set(x, v);
		c=max(l->c, r->c);
		//if(c<0)d=1e18;
		//ans=max({ans, c-d, l->ans, r->ans});
		//printf("segment %lld to %lld, c %lld, d %lld, ans %lld\n", s,e,c,d,ans);
	}
	void chmin(int S, int E, int v){
		if(S <= s and e<=E) {
			//if (c > 0) {
				lz=v;
				ans=max(ans, c-lz);
			//}
			//printf("segment %lld to %lld, c %lld, d %lld, ans %lld\n", s,e,c,d,ans);
			return;
		}
		prop();
		if(E <= m) l->chmin(S, E, v);
		else if(S > m) r->chmin(S, E, v);
		else{
			l->chmin(S, m, v);
			r->chmin(m+1, E, v);
		}
		ans=max({ans, l->ans, r->ans});
		//printf("segment %lld to %lld, c %lld, d %lld, ans %lld\n", s,e,c,d,ans);
	}
	int qry(int S, int E){
		//printf("s %lld e %lld S %lld E %lld\n",s,e,S,E);
		if(S <= s and e <= E){
			return ans;
		}
		prop();
		if(E <= m) return l->qry(S, E);
		if(S > m) return r->qry(S, E);
		return max(l->qry(S, m), r->qry(m+1, E));
	}
} *root;

vector<int> solve(vector<int> h, vector<pll> d, vector<pll> qs){
	int n=sz(h), q=sz(qs);
	root = new node(0, n);
	vector<vector<pll>> todo(n), qep(n);
	vector<int> ans(q, 0);
	for(int i=0;i<n;i++){
		auto [a, b] = d[i];
		if(i + a < n) todo[i+a].pb({i, 1});
		if(i + b + 1 < n) todo[i+b+1].pb({i, -1});
	}
	for(int i=0;i<q;i++){
		qep[qs[i].s].pb({qs[i].f, i});
	}
	for (int x=0;x<n;x++){
		//printf(" --------- %lld ----------\n", x);
		for (auto [i, t] : todo[x]){
			//printf("setting %lld , t %lld\n", i, t);
			if(t==1){
				root->set(i, h[i]);
			}
			else {
				root->set(i, -1e18);
			}
		}
		int l=max(0ll, x-d[x].s), r=max((int)-1, x-d[x].f);
		if(r >= l){
			//printf("chminning %lld %lld %lld\n", l, r, h[x]);
			root->chmin(l, r, h[x]);
		}
		for (auto [l, qind] : qep[x]){
			//printf("qrying %lld to %lld qind %lld\n", l, x, qind);
			ans[qind]=root->qry(l, x);
		}
	}
	return ans;
}

signed main(){
	int n,q;cin>>n;
	vector<int> h(n);
	vector<pll> d(n);
	for(int i=0;i<n;i++) cin>>h[i]>>d[i].f>>d[i].s;
	cin>>q;
	vector<pll> qs(q);
	for(int i=0;i<q;i++) {
		cin>>qs[i].f>>qs[i].s;
		qs[i].f--, qs[i].s--;
	}
	vector<int> a1(q, -1), a2(q, -1);
	a1=solve(h, d, qs);
	reverse(h.begin(),h.end());
	reverse(d.begin(),d.end());
	for(int i=0;i<q;i++){
		qs[i]={n-qs[i].s-1, n-qs[i].f-1};
	}
	a2=solve(h, d, qs);
	for(int i=0;i<q;i++){
		cout<<max(a1[i], a2[i])<<'\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...