Submission #158517

#TimeUsernameProblemLanguageResultExecution timeMemory
158517HungAnhGoldIBO2020Two Antennas (JOI19_antennas)C++14
100 / 100
1031 ms40396 KiB
#include<bits/stdc++.h>
const int N=2e5+2;
const int inf=1e9+7;
using namespace std;
vector<int> que_lis[N];
vector<pair<int,bool> > event[N];
int c[4*N],d[4*N],lazy[4*N],ar[N],ans[N],ranl[N],ranr[N];
pair<int,int> que[N];
void init(int idx,int l,int r){
	c[idx]=-inf;
	d[idx]=-inf;
	lazy[idx]=-inf;
	if(l==r){
		return;
	}
	int mid=(l+r)>>1;
	init(idx<<1,l,mid);
	init(idx<<1|1,mid+1,r);
}
void push(int idx,int l,int r){
	lazy[idx<<1]=max(lazy[idx<<1],lazy[idx]);
	lazy[idx<<1|1]=max(lazy[idx<<1|1],lazy[idx]);
	d[idx<<1]=max(c[idx<<1]+lazy[idx<<1],d[idx<<1]);
	d[idx<<1|1]=max(c[idx<<1|1]+lazy[idx<<1|1],d[idx<<1|1]);
	lazy[idx]=-inf;	
}
void upd(int idx,int l,int r,int pos,bool haiz){
	if(l>pos||r<pos){
		return;	
	}	
	if(l==r){
		if(haiz){
			c[idx]=ar[pos];
		}
		else{
			d[idx]=max(d[idx],c[idx]+lazy[idx]);
			c[idx]=-inf;
		}
		lazy[idx]=-inf;
		return;
	}
	if(lazy[idx]!=-inf){
		push(idx,l,r);
	}
	int mid=(l+r)>>1;
	upd(idx<<1,l,mid,pos,haiz);
	upd(idx<<1|1,mid+1,r,pos,haiz);
	c[idx]=max(c[idx<<1],c[idx<<1|1]);
	d[idx]=max(max(c[idx]+lazy[idx],d[idx]),max(d[idx<<1],d[idx<<1|1]));
}
void upd1(int idx,int l,int r,int lef,int rig,int val){
	if(l>rig||r<lef){
		return;
	}
	if(l>=lef&&r<=rig){
		lazy[idx]=max(lazy[idx],val);
		val=-inf;
		if(l!=r){
			val=max(d[idx<<1],d[idx<<1|1]);
		}
		d[idx]=max(max(c[idx]+lazy[idx],d[idx]),val);
		return;
	}
	if(lazy[idx]!=-inf){
		push(idx,l,r);
	}
	int mid=(l+r)>>1;
	upd1(idx<<1,l,mid,lef,rig,val);
	upd1(idx<<1|1,mid+1,r,lef,rig,val);
	d[idx]=max(max(c[idx]+lazy[idx],d[idx]),max(d[idx<<1],d[idx<<1|1]));
}
int getmax(int idx,int l,int r,int lef,int rig){
	if(l>rig||r<lef){
		return -inf;
	}
	if(l>=lef&&r<=rig){
		return d[idx];
	}
	if(lazy[idx]!=-inf){
		push(idx,l,r);
	}
	int mid=(l+r)>>1;
	return max(getmax(idx<<1,l,mid,lef,rig),getmax(idx<<1|1,mid+1,r,lef,rig));
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n,i,j,k,l,q;
	cin>>n;
	init(1,1,n);
	for(i=1;i<=n;i++){
		cin>>ar[i]>>ranl[i]>>ranr[i];
		ranr[i]++;
		if(i+ranl[i]<=n){
			event[i+ranl[i]].push_back({i,true});
		}
		if(i+ranr[i]<=n){
			event[i+ranr[i]].push_back({i,false});
		}
	}
	cin>>q;
	for(i=1;i<=q;i++){
		ans[i]=-1;
		cin>>que[i].first>>que[i].second;
		que_lis[que[i].second].push_back(i);
	}
	for(i=1;i<=n;i++){
		for(j=0;j<event[i].size();j++){
			upd(1,1,n,event[i][j].first,event[i][j].second);
		}
		if(i-ranl[i]>0){
			upd1(1,1,n,max(1,i-ranr[i]+1),i-ranl[i],-ar[i]);
		}
		for(j=0;j<que_lis[i].size();j++){
//			cout<<que_lis[i][j]<<' '<<getmax(1,1,n,que[que_lis[i][j]].first,i)<<endl;
			ans[que_lis[i][j]]=max(ans[que_lis[i][j]],getmax(1,1,n,que[que_lis[i][j]].first,i));
		}
		event[i].clear();
		que_lis[i].clear();
	}
	init(1,1,n);
	for(i=n;i>=1;i--){
		if(i-ranl[i]>0){
			event[i-ranl[i]].push_back({i,true});
		}
		if(i-ranr[i]>0){
			event[i-ranr[i]].push_back({i,false});
		}
	}
	for(i=1;i<=q;i++){
		que_lis[que[i].first].push_back(i);
	}
	for(i=n;i>=1;i--){
		for(j=0;j<event[i].size();j++){
			upd(1,1,n,event[i][j].first,event[i][j].second);
		}
		if(i+ranl[i]<=n){
			upd1(1,1,n,i+ranl[i],min(i+ranr[i]-1,n),-ar[i]);
		}
		for(j=0;j<que_lis[i].size();j++){
			ans[que_lis[i][j]]=max(ans[que_lis[i][j]],getmax(1,1,n,i,que[que_lis[i][j]].second));
		}
	}
	for(i=1;i<=q;i++){
		cout<<ans[i]<<'\n';
	}
}
/*
5
10 2 4
1 1 1
2 1 3
1 1 1
100 1 1
5
1 2
2 3
1 3
1 4
1 5
*/

Compilation message (stderr)

antennas.cpp: In function 'int main()':
antennas.cpp:108:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(j=0;j<event[i].size();j++){
           ~^~~~~~~~~~~~~~~~
antennas.cpp:114:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(j=0;j<que_lis[i].size();j++){
           ~^~~~~~~~~~~~~~~~~~
antennas.cpp:134:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(j=0;j<event[i].size();j++){
           ~^~~~~~~~~~~~~~~~
antennas.cpp:140:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(j=0;j<que_lis[i].size();j++){
           ~^~~~~~~~~~~~~~~~~~
antennas.cpp:88:12: warning: unused variable 'k' [-Wunused-variable]
  int n,i,j,k,l,q;
            ^
antennas.cpp:88:14: warning: unused variable 'l' [-Wunused-variable]
  int n,i,j,k,l,q;
              ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...