제출 #1309982

#제출 시각아이디문제언어결과실행 시간메모리
1309982StefanSebezFire (JOI20_ho_t5)C++20
100 / 100
235 ms60612 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define ll long long #define ld long double #define mp make_pair const int N=2e5+50; int n,q,a[N],Lv[N],Rv[N]; vector<array<int,3>>Qs[N]; ll res[N]; struct BIT{ ll T[2*N+50]; void Update(int i,ll x){i+=N;for(;i<=2*N;i+=i&-i)T[i]+=x;} ll Get(int i){i+=N;ll x=0;for(;i>=1;i-=i&-i)x+=T[i];return x;} ll Get(int l,int r){return Get(r)-Get(l-1);} }; struct BIT1{ BIT bt,bt1; void Update(int l,int r,ll x){ bt.Update(l,x);bt1.Update(l,x*l); bt.Update(r+1,-x);bt1.Update(r+1,-x*(r+1)); } ll Get(int i){return bt.Get(i)*(i+1)-bt1.Get(i);} ll Get(int l,int r){return Get(r)-Get(l-1);} }bt[2]; vector<array<int,3>>ev0[2*N],ev1[2*N]; void Addtriangle(int l,int r,int x){ ev0[0].pb({l,n,x}); ev0[r-l+1].pb({l,n,-x}); ev1[0].pb({r+1,n,-x}); ev1[r-l+1].pb({r+1,n,x}); } int main(){ scanf("%i%i",&n,&q); for(int i=1;i<=n;i++)scanf("%i",&a[i]); for(int i=1;i<=q;i++){ int t,l,r;scanf("%i%i%i",&t,&l,&r); Qs[t].pb({l,r,i}); } vector<int>mono; for(int i=1;i<=n;i++){ Rv[i]=n+1; while(!mono.empty()&&a[mono.back()]<=a[i]){ Rv[mono.back()]=i; mono.pop_back(); } mono.pb(i); } mono.clear(); for(int i=n;i>=1;i--){ Lv[i]=-n; while(!mono.empty()&&a[mono.back()]<a[i]){ Lv[mono.back()]=i; mono.pop_back(); } mono.pb(i); } for(int i=1;i<=n;i++){ Addtriangle(Lv[i]+1,Rv[i]-1,a[i]); Addtriangle(Lv[i]+1,i-1,-a[i]); Addtriangle(i+1,Rv[i]-1,-a[i]); } for(int t=0;t<=n;t++){ for(auto [l,r,x]:ev0[t])bt[0].Update(l,r,x); for(auto [l,r,x]:ev1[t])bt[1].Update(l,r,x); for(auto [l,r,i]:Qs[t])res[i]=bt[0].Get(l-t,r-t)+bt[1].Get(l,r); } for(int i=1;i<=q;i++)printf("%lld\n",res[i]); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

ho_t5.cpp: In function 'int main()':
ho_t5.cpp:36:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   36 |     scanf("%i%i",&n,&q);
      |     ~~~~~^~~~~~~~~~~~~~
ho_t5.cpp:37:31: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   37 |     for(int i=1;i<=n;i++)scanf("%i",&a[i]);
      |                          ~~~~~^~~~~~~~~~~~
ho_t5.cpp:39:24: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   39 |         int t,l,r;scanf("%i%i%i",&t,&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...
#Verdict Execution timeMemoryGrader output
Fetching results...