Advertisement
Guest User

Untitled

a guest
Dec 6th, 2014
321
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. #define endl '\n'
  8.  
  9. const int maxN = 3 << 17;
  10. const int maxK = 1 << 10;
  11. const int INF = (int)1e9;
  12. typedef long long ll;
  13.  
  14. int o[maxN];
  15.  
  16. ll add[maxN];
  17. ll need[maxN];
  18. int start[maxN];
  19. ll startNeed[maxN];
  20.  
  21. int l[maxN];
  22. int r[maxN];
  23. ll a[maxN];
  24.  
  25. vector<int> pos[maxN];
  26.  
  27. int main() {
  28.     ios_base::sync_with_stdio(0);
  29.  
  30.     for (int i = 0; i < maxN; i++) {
  31.         start[i] = INF;
  32.     }
  33.  
  34.     int n, m;
  35.     cin >> n >> m;
  36.     for (int i = 1; i <= m; i++) {
  37.         cin >> o[i];
  38.         pos[o[i]].push_back(i);
  39.     }
  40.  
  41.     for (int i = 1; i <= n; i++) {
  42.         cin >> need[i];
  43.     }
  44.  
  45.     int q;
  46.     cin >> q;
  47.     for (int i = 1; i <= q; i++) { // O((m + n) * q / maxK)
  48.         cin >> l[i] >> r[i] >> a[i];
  49.         if (l[i] > r[i]) {
  50.             add[1] += a[i];
  51.             add[r[i] + 1] -= a[i];
  52.  
  53.             add[l[i]] += a[i];
  54.             add[m + 1] -= a[i];
  55.         } else {
  56.             add[l[i]] += a[i];
  57.             add[r[i] + 1] -= a[i];
  58.         }
  59.         if (i % maxK == 0 || i == q) {
  60.             ll s = 0;
  61.             for (int j = 1; j <= m; j++) {
  62.                 s += add[j];
  63.                 add[j] = 0;
  64.                 need[o[j]] -= s;
  65.             }
  66.             for (int j = 1; j <= n; j++) {
  67.                 if (start[j] == INF && need[j] <= 0) {
  68.                     startNeed[j] = need[j];
  69.                     start[j] = i;
  70.                 }
  71.             }
  72.         }
  73.     }
  74.  
  75.     for (int i = 1; i <= n; i++) { // O((m + n) * maxK)
  76.         if (start[i] == INF) {
  77.             cout << "NIE" << endl;
  78.             continue;
  79.         }
  80.         int j = start[i];
  81.         ll s = startNeed[i];
  82.         while (s <= 0 && j > 0) {
  83.             for (int ii = 0; ii < (int)pos[i].size(); ii++) {
  84.                 int x = pos[i][ii];
  85.                 if (l[j] > r[j] && (x >= l[j] || x <= r[j])) {
  86.                     s += a[j];
  87.                 }
  88.                 if (l[j] <= r[j] && (x >= l[j] && x <= r[j])) {
  89.                     s += a[j];
  90.                 }
  91.             }
  92.             j--;
  93.         }
  94.         cout << j + 1 << endl;
  95.     }
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement