Submission #1297426

#TimeUsernameProblemLanguageResultExecution timeMemory
1297426tdkhaiTwo Antennas (JOI19_antennas)C++20
100 / 100
289 ms41912 KiB
#include<bits/stdc++.h> #define ii pair<int,int> //#define int long long #define ll long long #define pb push_back #define fi first #define se second #define tdk "tdk" #define db double using namespace std; const ll INF = 1e18; const int inf=1e9; const int dx[]={1,-1,0,0}; const int dy[]={0,0,1,-1}; const int N=2e5+5; int a[N],b[N],h[N],ans[N],n,q; vector<int> in[N],out[N]; vector<ii> query[N]; struct smt { struct node { int maxh,minh,lazymax,lazymin,res; }; node mg(node a,node b) { node ret; ret.maxh=max(a.maxh,b.maxh); ret.minh=min(a.minh,b.minh); ret.res=max(a.res,b.res); ret.lazymin=inf; ret.lazymax=-inf; return ret; } node st[N<<2+3]; void init() { for(int i=0;i<=N<<2;i++) { st[i]={-inf,inf,-inf-1,inf,-1}; } } void push(int id) { int nxt=id*2,&mx=st[id].lazymax,&mn=st[id].lazymin; st[nxt].lazymax=max(st[nxt].lazymax,mx); st[nxt+1].lazymax=max(st[nxt+1].lazymax,mx); // st[nxt].maxh=max(st[nxt].maxh,mx); // st[nxt+1].maxh=max(st[nxt+1].maxh,mx); // st[nxt].minh=min(st[nxt].minh,mn); // st[nxt+1].minh=min(st[nxt+1].minh,mn); st[nxt].lazymin=min(st[nxt].lazymin,mn); st[nxt+1].lazymin=min(st[nxt+1].lazymin,mn); st[nxt].res=max({st[nxt].res,st[nxt].maxh-mn,mx-st[nxt].minh}); st[nxt+1].res=max({st[nxt+1].res,st[nxt+1].maxh-mn,mx-st[nxt+1].minh}); mx=-inf,mn=inf; } void update(int id,int l,int r,int u,int val) { if(l==r) { if(val==-1) { st[id].maxh=-inf; st[id].minh=inf; } else { st[id].maxh=val; st[id].minh=val; } } else { int mid=l+r>>1; push(id); if(u<=mid) update(id*2,l,mid,u,val); else update(id*2+1,mid+1,r,u,val); st[id]=mg(st[id*2],st[id*2+1]); } } void updaterng(int id,int l,int r,int u,int v,int val) { if(l>v or r<u) return; if(l>=u and r<=v) { st[id].res=max({st[id].res,val-st[id].minh,st[id].maxh-val}); // st[id].minh=min(st[id].minh,val); // st[id].maxh=max(st[id].maxh,val); st[id].lazymax=max(st[id].lazymax,val); st[id].lazymin=min(st[id].lazymin,val); } else { push(id); int mid=l+r>>1; updaterng(id*2,l,mid,u,v,val); updaterng(id*2+1,mid+1,r,u,v,val); st[id]=mg(st[id*2],st[id*2+1]); } } int get(int id,int l,int r,int u,int v) { if(l>v or r<u) return -1; if(l>=u and r<=v) return st[id].res; int mid=l+r>>1; push(id); return max(get(id*2,l,mid,u,v),get(id*2+1,mid+1,r,u,v)); } }T; void solve() { cin >> n; for(int i=1;i<=n;i++) { cin >> h[i] >> a[i] >> b[i]; } T.init(); for(int i=1;i<=n;i++) { if(i+a[i]<=n) { in[i+a[i]].pb(i); } if(i+b[i]<n) { out[i+b[i]+1].pb(i); } } cin >> q; for(int i=1;i<=q;i++) { int l,r; cin >> l >> r; query[r].pb({l,i}); } for(int i=1;i<=n;i++) { // cout << "in" << " "; for(int j:in[i]) { // cout << j << ' '; T.update(1,1,n,j,h[j]); } // cout << '\n' << "out "; for(int j:out[i]) { // cout << j << ' '; T.update(1,1,n,j,-1); } // cout << '\n'; if(i-a[i]>=1) { T.updaterng(1,1,n,max(1,i-b[i]),i-a[i],h[i]); } for(ii j:query[i]) { int l=j.fi,id=j.se; ans[id]=T.get(1,1,n,l,i); } } for(int i=1;i<=q;i++) { cout << ans[i] << '\n'; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if(fopen(tdk".inp","r")) { freopen(tdk".inp","r",stdin); freopen(tdk".out","w",stdout); } int t=1; // cin >> t; while(t--) { solve(); cout << '\n'; } }

Compilation message (stderr)

antennas.cpp: In function 'int main()':
antennas.cpp:178:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  178 |         freopen(tdk".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
antennas.cpp:179:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  179 |         freopen(tdk".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...