Submission #491710

#TimeUsernameProblemLanguageResultExecution timeMemory
491710faresbasbs새로운 문제 (POI11_met)C++14
0 / 100
6089 ms38168 KiB
#include <bits/stdc++.h> using namespace std; struct p{ long long l1,r1,l2,r2,val; }; const int sq = 300001; long long n,m,k,t,type[300001],val[300001],sum[300001]; pair<long long,long long> lst[300001]; vector<long long> segment,all[300001]; bool done[300001]; p event[300001]; void upd(int a , int b , int v , int curr , int l , int r){ if(b < l || a > r){ return ; } if(a <= l && b >= r){ segment[curr] += v; return ; } int mid = (l+r)/2; upd(a,b,v,2*curr,l,mid),upd(a,b,v,2*curr+1,mid+1,r); } long long getsum(int idx){ idx += t-1; long long ret = 0; while(idx){ ret += segment[idx]; idx /= 2; } return ret; } long long num(int l , int r , int idx){ return (upper_bound(all[idx].begin(),all[idx].end(),r)-all[idx].begin())-(lower_bound(all[idx].begin(),all[idx].end(),l)-all[idx].begin()); } long long getval(int idx , int ev){ long long numb = num(event[ev].l1,event[ev].r1,idx)+(event[ev].l2 == -1 ? 0ll : num(event[ev].l2,event[ev].r2,idx)); return event[ev].val*numb; } void check(int idx){ for(int i = 1 ; i <= n ; i += 1){ sum[i] = 0; } for(int i = 1 ; i <= m ; i += 1){ if(done[type[i]]){ continue; } sum[type[i]] += getsum(i); } for(int i = 1 ; i <= n ; i += 1){ if(sum[i] >= val[i]){ done[i] = 1; } if(done[i]){ continue; } lst[i] = {sum[i],idx}; } } int main(){ ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL); cin >> n >> m; t = pow(2,ceil(log2(m))); segment.resize(2*t,0); for(int i = 1 ; i <= m ; i += 1){ cin >> type[i]; all[type[i]].push_back(i); } for(int i = 1 ; i <= n ; i += 1){ cin >> val[i]; lst[i] = {0,0}; } cin >> k; for(int i = 1 ; i <= k ; i += 1){ int l,r,v; cin >> l >> r >> v; if(r >= l){ event[i] = {l,r,-1,-1,v}; upd(l,r,v,1,1,t); }else{ event[i] = {l,m,1,r,v}; upd(l,m,v,1,1,t),upd(1,r,v,1,1,t); } if(i%sq == 0){ check(i); } } check(m); for(int i = 1 ; i <= n ; i += 1){ if(!done[i]){ cout << "NIE\n"; continue; } pair<long long,long long> curr = lst[i]; while(curr.first <= val[i]){ curr.second += 1; curr.first += getval(i,curr.second); } cout << curr.second << '\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...