Submission #613625

#TimeUsernameProblemLanguageResultExecution timeMemory
613625juggernautTwo Antennas (JOI19_antennas)C++14
13 / 100
3084 ms20572 KiB
#include<bits/stdc++.h>
#define fr first
#define sc second
using namespace std;
typedef long long ll;
typedef long double ld;
template<class T>void umax(T &a,T b){if(a<b)a=b;}
template<class T>void umin(T &a,T b){if(b<a)a=b;}
#ifdef juggernaut
    #define printl(args...) printf(args)
#else
    #define printl(args...) 0
#endif
int h[200005];
int a[200005];
int b[200005];
const int inf=1e9;
int ans[200005];
int n;
vector<pair<int,int>>queries;
int q;
int lz[800005];
pair<int,int>tree[800005];
/*void build(int v,int l,int r){
	if(l==r){
		lz[v]=0;
		tree[v]={-inf,0};
		return;
	}
	int mid=(l+r)>>1;
	build(v<<1,l,mid);
	build(v<<1|1,mid+1,r);
	tree[v]=max(tree[v<<1],tree[v<<1|1]);
}
void push(int &v,int &l,int &r){
	if(l^r){
		umax(lz[v<<1],lz[v]);
		umax(lz[v<<1|1],lz[v]);
	}
	lz[v]=0;
}
void st(int v,int l,int r,int pos,int val,int mx=0){
	umax(mx,lz[v]);
	if(l==r){
		tree[v]={mx-val,-mx};
		lz[v]=0;
		return;
	}else{
		umax(lz[v<<1],lz[v]);
		umax(lz[v<<1|1],lz[v]);
	}
	int mid=(l+r)>>1;
	if(pos<=mid)st(v<<1,l,mid,pos,val,mx);
	else st(v<<1|1,mid+1,r,pos,val,mx);
	tree[v]=max(tree[v<<1],tree[v<<1|1]);
}
void chmax(int v,int l,int r,int ql,int qr,int val){
	if(qr<l||r<ql)return;
	if(ql<=l&&r<=qr){
		umax(lz[v],val);
		if(-tree[v].sc<lz[v]){
			int pivot=lz[v]+tree[v].sc;
			tree[v].sc-=pivot;
			tree[v].fr+=pivot;
		}
		return;
	}
	int mid=(l+r)>>1;
	chmax(v<<1,l,mid,ql,qr,val);
	chmax(v<<1|1,mid+1,r,ql,qr,val);
	tree[v]=max(tree[v<<1],tree[v<<1|1]);
}
int get(int v,int l,int r,int ql,int qr){
	if(qr<l||r<ql)return -1;
	if(ql<=l&&r<=qr)return tree[v].fr;
	int mid=(l+r)>>1;
	return max(get(v<<1,l,mid,ql,qr),get(v<<1|1,mid+1,r,ql,qr));
}*/
int x[200005];
int y[200005];
int best[200005];
void build(int v,int l,int r){
	for(int i=l;i<=r;i++){
		x[i]=0;
		y[i]=inf;
		best[i]=-inf;
	}
}
void st(int v,int l,int r,int pos,int val){
	y[pos]=val;
	x[pos]=0;
	umax(best[pos],-val);
}
void chmax(int v,int l,int r,int ql,int qr,int val){
	for(int i=ql;i<=qr;i++){
		umax(x[i],val);
		umax(best[i],x[i]-y[i]);
	}
}
int get(int v,int l,int r,int ql,int qr){
	int ans=-1;
	for(int i=ql;i<=qr;i++)umax(ans,best[i]);
	return ans;
}
void solve(){
	build(1,1,n);
	vector<vector<int>>inc(n+1),exc(n+1),query(n+1);
	for(int i=0;i<q;i++)query[queries[i].fr].push_back(i);
	for(int i=1;i<=n;i++){
		if(i>a[i]){
			exc[max(1,i-b[i])].push_back(i);
			inc[i-a[i]].push_back(i);
		}
	}
	for(int i=n;i;i--){
		for(int idx:inc[i])st(1,1,n,idx,h[idx]);
		if(i+a[i]<=n)
			chmax(1,1,n,i+a[i],min(i+b[i],n),h[i]);
		for(int idx:query[i])
			umax(ans[idx],get(1,1,n,i,queries[idx].sc));
		for(int idx:exc[i])st(1,1,n,idx,inf);
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d%d%d",&h[i],&a[i],&b[i]);
	scanf("%d",&q);
	for(int i=0;i^q;i++){
		int l,r;
		scanf("%d%d",&l,&r);
		queries.emplace_back(l,r);
		ans[i]=-1;
	}
	solve();
	reverse(h+1,h+1+n);
	reverse(a+1,a+1+n);
	reverse(b+1,b+1+n);
	for(auto &to:queries)to=make_pair(n-to.sc+1,n-to.fr+1);
	solve();
	for(int i=0;i<q;i++)printf("%d\n",ans[i]);
}

Compilation message (stderr)

antennas.cpp: In function 'int main()':
antennas.cpp:125:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  125 |  scanf("%d",&n);
      |  ~~~~~^~~~~~~~~
antennas.cpp:126:28: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  126 |  for(int i=1;i<=n;i++)scanf("%d%d%d",&h[i],&a[i],&b[i]);
      |                       ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
antennas.cpp:127:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  127 |  scanf("%d",&q);
      |  ~~~~~^~~~~~~~~
antennas.cpp:130:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  130 |   scanf("%d%d",&l,&r);
      |   ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...