제출 #919456

#제출 시각아이디문제언어결과실행 시간메모리
919456noyancanturkMeteors (POI11_met)C++17
74 / 100
940 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[4*lim]; struct segtree{ int n; segtree(int n):n(n){ for(int i=1;i<=4*n;i++){ tree[i]=0; } } int L,R,VAL; void update(int l,int r,int node){ if(L<=l&&r<=R){ tree[node]+=VAL; return; } if(r<L||R<l){ return; } int mid=(l+r)>>1,child=node<<1; update(l,mid,child),update(mid+1,r,child|1); } void insert(int l,int r,int val){ L=l,R=r,VAL=val; update(1,n,1); } int P; int query(int l,int r,int node){ //cerr<<l<<" "<<r<<" "<<tree[node]<<"\n"; if(l==r)return tree[node]; int mid=(l+r)>>1,child=node<<1; if(P<=mid)return tree[node]+query(l,mid,child); return tree[node]+query(mid+1,r,child|1); } int query(int p){ //cerr<<p<<"\n"; P=p; return query(1,n,1); } }; struct bs{ int l,r,i; inline bs(){} inline bs(int l,int r,int i) :l(l),r(r),i(i){} }; struct comp{ inline bool operator()(bs&a,bs&b){ return (a.l+a.r)/2<(b.l+b.r)/2; } }; inline void solve(){ int n,m; cin>>n>>m; vector<int>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<bs>qq[k+1]; for(int i=1;i<=n;i++){ qq[(1+k)>>1].pb(bs(1,k,i)); } int ans[n+1]; memset(ans,-1,sizeof(ans)); bool ok=1; while(ok){ ok=0; segtree st(m+10); for(int t=1;t<=k;t++){ if(all[t].l<=all[t].r)st.insert(all[t].l,all[t].r,all[t].i); else { st.insert(all[t].l,m,all[t].i); st.insert(1,all[t].r,all[t].i); } while(qq[t].size()){ bs 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.i]){ tot+=st.query(j); } //cerr<<mid<<" "<<tot<<"\n\n"; int mid=(now.l+now.r)>>1; if(goal[now.i]<=tot){ ans[now.i]=mid; if(now.l<=mid-1){ qq[(now.l+mid-1)>>1].pb(bs(now.l,mid-1,now.i)); ok=1; } }else{ if(mid+1<=now.r){ qq[(mid+1+now.r)>>1].pb(bs(mid+1,now.r,now.i)); 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...