Submission #919466

#TimeUsernameProblemLanguageResultExecution timeMemory
919466noyancanturk새로운 문제 (POI11_met)C++17
100 / 100
1226 ms65536 KiB
#ifndef Local #pragma GCC optimize("O3,unroll-loops") const int lim=3e5+100; #else const int lim=1e3+100; #endif #include "bits/stdc++.h" using namespace std; #define int int64_t #define pb push_back const int mod=1e9+7; using pii=pair<int,int>; int tree[lim]; struct fenwick{ int n; fenwick(int n):n(n){ for(int i=0;i<=n;i++)tree[i]=0; } void update(int p,int val){ while(p<=n){ tree[p]+=val; p+=p&-p; } } void update(int l,int r,int val){ update(l,val),update(r+1,-val); } int query(int p){ int ans=0; while(p){ ans+=tree[p]; p-=p&-p; } return ans; } }; struct bs{ signed l,r; signed i; }; inline void solve(){ int n,m; cin>>n>>m; vector<signed>v[n+1]; for(int i=1;i<=m;i++){ int tem; cin>>tem; v[tem].pb(i); } int goal[n+1]; for(int i=1;i<=n;i++){ cin>>goal[i]; } int k; cin>>k; bs all[k+1]; for(int i=1;i<=k;i++){ cin>>all[i].l>>all[i].r>>all[i].i; } vector<signed>qq[k+1]; for(int i=1;i<=n;i++){ qq[(1+k)>>1].pb(i); } signed l[k+1],r[k+1]; l[(1+k)>>1]=1,r[(1+k)>>1]=k; signed ans[n+1]; memset(ans,-1,sizeof(ans)); bool ok=1; while(ok){ ok=0; fenwick st(m+10); for(int t=1;t<=k;t++){ if(all[t].l<=all[t].r)st.update(all[t].l,all[t].r,all[t].i); else { st.update(all[t].l,m,all[t].i); st.update(1,all[t].r,all[t].i); } while(qq[t].size()){ int now=qq[t].back(); qq[t].pop_back(); //cerr<<now.l<<" "<<now.r<<" "<<now.i<<"\n\n"; int tot=0; for(int j:v[now]){ tot+=st.query(j); if(goal[now]<=tot)break; } //cerr<<mid<<" "<<tot<<"\n\n"; int mid=(l[t]+r[t])>>1; if(goal[now]<=tot){ ans[now]=mid; if(l[t]<=mid-1){ qq[(l[t]+mid-1)>>1].pb(now); l[(l[t]+mid-1)>>1]=l[t]; r[(l[t]+mid-1)>>1]=mid-1; ok=1; } }else{ if(mid+1<=r[t]){ qq[(mid+1+r[t])>>1].pb(now); l[(mid+1+r[t])>>1]=mid+1; r[(mid+1+r[t])>>1]=r[t]; ok=1; } } } } } for(int i=1;i<=n;i++){ if(ans[i]==-1)cout<<"NIE\n"; else cout<<ans[i]<<"\n"; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); #ifdef Local freopen(".in","r",stdin); freopen(".out","w",stdout); #else #endif int t=1; //cin>>t; while (t--) { solve(); } }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...