Submission #1104932

#TimeUsernameProblemLanguageResultExecution timeMemory
1104932IrateMeteors (POI11_met)C++17
100 / 100
786 ms28788 KiB
#include<cstdio> #include<vector> using namespace std; const int mxN = 3e5 + 5; long long fen[mxN]; vector<int> pos[mxN]; int sectors[mxN], need[mxN], ans[mxN]; int P = -1, n, m, q; void Update(int pos, int val){ while(pos < mxN){ fen[pos] += val; pos += (pos & -pos); } } long long Sum(int pos){ long long sum = 0; while(pos > 0){ sum += fen[pos]; pos -= (pos & -pos); } return sum; } struct Query{ int l, r, a; } queries[mxN]; void f(int l, int r, vector<int>&exist){ int mid = (l + r) / 2; if(mid == q){ for(int &sector : exist){ ans[sector] = -1; } return; } if(l == r){ for(int &sector : exist){ ans[sector] = l; } return; } while(P + 1 <= mid){ P++; int l = queries[P].l, r = queries[P].r, a = queries[P].a; if(l <= r){ Update(l, a); Update(r + 1, -a); } else{ Update(l, a); Update(1, a); Update(r + 1, -a); } } while(P - 1 >= mid){ int l = queries[P].l, r = queries[P].r, a = queries[P].a; if(l <= r){ Update(l, -a); Update(r + 1, a); } else{ Update(l, -a); Update(1, -a); Update(r + 1, a); } P--; } vector<int>left, right; for(int &sector : exist){ long long tot = 0; for(int &i : pos[sector]){ tot += Sum(i); if(tot >= need[sector]){ break; } } if(tot >= need[sector]){ left.push_back(sector); } else{ right.push_back(sector); } } f(l, mid, left); f(mid + 1, r, right); } int main(){ scanf("%d%d", &m, &n); for(int i = 1;i <= n;++i){ scanf("%d", &sectors[i]); pos[sectors[i]].push_back(i); } vector<int>exist; for(int i = 1;i <= m;++i){ scanf("%d", &need[i]); exist.push_back(i); } scanf("%d", &q); for(int i = 0;i < q;++i){ int l, r, a; scanf("%d%d%d", &l, &r, &a); queries[i] = {l, r, a}; } f(0, q, exist); for(int i = 1;i <= m;++i){ if(ans[i] < 0){ printf("NIE\n"); } else{ printf("%d\n", ans[i] + 1); } } }

Compilation message (stderr)

met.cpp: In function 'int main()':
met.cpp:86:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   86 |     scanf("%d%d", &m, &n);
      |     ~~~~~^~~~~~~~~~~~~~~~
met.cpp:88:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   88 |         scanf("%d", &sectors[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~
met.cpp:93:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |         scanf("%d", &need[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~
met.cpp:96:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   96 |     scanf("%d", &q);
      |     ~~~~~^~~~~~~~~~
met.cpp:99:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   99 |         scanf("%d%d%d", &l, &r, &a);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...