Advertisement
Guest User

Untitled

a guest
Dec 9th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pb push_back
  4. #define db(x) cerr << #x << " = " << x << endl
  5. #define _ << ", " <<
  6.  
  7. typedef long long ll;
  8. const int N = 3e5 + 5;;
  9. ll bit[N];
  10. int need[N], ans[N];
  11. bool ok[N];
  12.  
  13. vector<int> own[N];
  14. tuple<int, int, int> ms[N];
  15.  
  16. int n, m, k;
  17. int pnt;
  18.  
  19. ll query(int x){
  20.   ll ans = 0;
  21.   for(int i = x; i > 0; i-=i&-i)
  22.     ans += bit[i];
  23.  
  24.   return ans;
  25. }
  26.  
  27. void add(int l, int r, ll amt){
  28.   for(int i = l; i < N; i+=i&-i)
  29.     bit[i] += amt;
  30.  
  31.   for(int i = r + 1; i < N; i+=i&-i)
  32.     bit[i] -= amt;
  33. }
  34.  
  35. void cicAdd(int i, bool sub = false){
  36.   int l, r, amt;
  37.   tie(l, r, amt) = ms[i];
  38.  
  39.   if(sub) amt = -amt;
  40.  
  41.   if(l <= r) add(l, r, amt);
  42.   else add(1, r, amt), add(l, m, amt);
  43. }
  44.  
  45. void pbs(int l, int r, vector<int> &v){
  46.   int mid = (l + r)/2;
  47.   while(pnt < mid) cicAdd(++pnt);
  48.   while(pnt > mid) cicAdd(pnt--, true);
  49.  
  50.   vector<int> lv, rv;
  51.   for(auto st : v){
  52.     ll sum = 0;
  53.     for(auto sec : own[st]){
  54.       sum += query(sec);
  55.       if(sum > 1e9) sum = 1e9;
  56.     }
  57.  
  58.     if(sum >= need[st]){
  59.       lv.push_back(st);
  60.       ans[st] = mid;
  61.       ok[st] = true;
  62.     }
  63.     else rv.push_back(st);
  64.   }
  65.  
  66.   if(l == r) return;
  67.   pbs(l, mid, lv);
  68.   pbs(mid + 1, r, rv);
  69. }
  70.  
  71. int main(){
  72.   cin >> n >> m;
  73.  
  74.   vector<int> st;
  75.  
  76.   for(int i = 1; i <= m; i++){
  77.     int station;
  78.     cin >> station;
  79.     own[station].pb(i);
  80.   }
  81.  
  82.   for(int i = 1; i <= n; i++)
  83.     cin >> need[i], st.pb(i);
  84.  
  85.   cin >> k;
  86.   for(int i = 1; i <= k; i++){
  87.     int l, r, amt;
  88.     cin >> l >> r >> amt;
  89.     ms[i] = {l, r, amt};
  90.   }
  91.  
  92.   pbs(1, k, st);
  93.   for(int i = 1; i <= n; i++){
  94.     if(ok[i]) cout << ans[i] << '\n';
  95.     else cout << "NIE\n";
  96.   }
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement