제출 #1157004

#제출 시각아이디문제언어결과실행 시간메모리
1157004Nuraly_SerikbayMeteors (POI11_met)C++17
0 / 100
6096 ms76388 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define pf push_front #define F first #define S second #define IShowSpeed ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); #define all(a) a.begin(),a.end() const int N=3e5+10; const int mod=1e9+7; const ll inf=1e18+228; const int dx[] = {-1, 0, 0, 1}; const int dy[] = {0, -1, 1, 0}; ll a[N],b[N],l[N],r[N],x[N],L[N],R[N],mi[N],t[4*N],md[4*N],ans[N]; vector<ll>g[N],mids[N]; void ah(ll& x) { x = min(x,(ll)1e9); return; } void push(ll v, ll tl, ll tr) { if(tl != tr && md[v]) { ll mid = (tl + tr) >> 1; md[v+v] += md[v]; md[v+v+1] += md[v]; t[v+v] += md[v] * (mid - tl + 1); t[v+v+1] += md[v] * (tr - mid); md[v] = 0; } ah(md[v+v]); ah(md[v+v+1]); ah(t[v+v]); ah(t[v+v+1]); } void upd(ll v, ll tl, ll tr, ll l, ll r, ll x) { push(v,tl,tr); if(l > tr || tl > r) return; if(l <= tl && tr <= r) { md[v] += x; t[v] += md[v] * (tr - tl + 1); ah(md[v]); ah(t[v]); push(v,tl,tr); return; } ll mid = (tl + tr) >> 1; upd(v+v,tl,mid,l,r,x); upd(v+v+1,mid+1,tr,l,r,x); t[v] = t[v+v] + t[v+v+1]; ah(t[v]); } ll get(ll v, ll tl, ll tr, ll pos) { push(v,tl,tr); if(tl == tr) return t[v]; ll mid = (tl + tr) >> 1; if(pos <= mid) return get(v+v,tl,mid,pos); else return get(v+v+1,mid+1,tr,pos); } int main() { IShowSpeed ll tt=1; //cin>>tt; while(tt--) { ll n,m,q; cin>>n>>m; for(int i=1;i<=m;i++) { cin>>a[i]; g[a[i]].pb(i); } for(int i=1;i<=n;i++) cin>>b[i]; cin>>q; for(int i=1;i<=q;i++) cin>>l[i]>>r[i]>>x[i]; for(int i=1;i<=n;i++) { L[i] = 1; R[i] = q; mi[i] = (q+1) >> 1; } while(true) { bool chk = 0; for(int i=1;i<=m*4;i++) t[i] = md[i] = 0ll; for(int i=1;i<=q;i++) mids[i].clear(); for(int i=1;i<=n;i++) { if(L[i] <= R[i]) { chk = 1; mi[i] = (L[i] + R[i]) >> 1; mids[mi[i]].pb(i); } } if(!chk) break; for(int i=1;i<=q;i++) { if(l[i] <= r[i]) upd(1,1,m,l[i],r[i],x[i]); else { upd(1,1,m,l[i],m,x[i]); upd(1,1,m,1,r[i],x[i]); } for(ll x: mids[i]) { ll sum = 0; for(ll y: g[x]) { sum += get(1,1,m,y); if(sum >= b[x]) break; } if(sum >= b[x]) ans[x] = i,R[x] = i - 1; else L[x] = i + 1; } } } for(int i=1;i<=n;i++) { if(!ans[i]) cout<<"NIE\n"; else cout<<ans[i]<<"\n"; } } } /* */
#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...