Advertisement
Guest User

Meteors

a guest
Dec 22nd, 2014
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. typedef long long ll;
  4. using namespace std;
  5.  
  6. #define f(i,a,b) for(int i = (a); i <= (b); i++)
  7. #define pb push_back
  8. #define SZ(x) ((int)x.size())
  9.  
  10. // ----------------------------------------------------------------------------------------------------------
  11.  
  12. const int MAX = 300005;
  13. int M, N, Q;
  14. ll Add[MAX], Done[MAX], Goal[MAX], L[MAX], R[MAX], V[MAX];
  15. vector<ll> A(MAX,0), B(MAX,0), Meteors[MAX];
  16.  
  17. int main()
  18. {
  19.     scanf("%d%d", &N, &M);
  20.  
  21.     f(i,1,M)
  22.     {
  23.         int own;
  24.         scanf("%d", &own);
  25.         Meteors[own].pb(i);
  26.     }
  27.  
  28.     f(i,1,N) scanf("%d", &Goal[i]);
  29.  
  30.     scanf("%d", &Q);
  31.     f(q,1,Q) scanf("%d%d%d",&L[q],&R[q],&V[q]);
  32.  
  33.     int block = sqrt(Q);
  34.  
  35.     for(int from = 1; from <= Q; from += block)
  36.     {
  37.         int to = min(Q, from+block-1);
  38.  
  39.         f(i,0,M) Add[i] = 0;
  40.         B = A;
  41.  
  42.         f(i,from,to)
  43.         {
  44.             if(L[i] <= R[i]) Add[L[i]] += V[i], Add[R[i]+1] -= V[i];
  45.             else
  46.             {
  47.                 Add[1] += V[i], Add[R[i]+1] -= V[i];
  48.                 Add[L[i]] += V[i], Add[M+1] -= V[i];
  49.             }
  50.         }
  51.  
  52.         f(i,1,M)
  53.         {
  54.             Add[i] += Add[i-1];
  55.             B[i] += Add[i];
  56.         }
  57.  
  58.         f(c,1,N) if(!Done[c])
  59.         {
  60.             ll tot = 0;
  61.  
  62.             f(i,0,SZ(Meteors[c])-1)
  63.             {
  64.                 int m = Meteors[c][i];
  65.                 tot += B[m];
  66.             }
  67.  
  68.             if(tot >= Goal[c])
  69.             {
  70.                 ll am = 0;
  71.  
  72.                 f(i,0,SZ(Meteors[c])-1)
  73.                 {
  74.                     int m = Meteors[c][i];
  75.                     am += A[m];
  76.                 }
  77.  
  78.                 f(r,from,to)
  79.                 {
  80.                     f(i,0,SZ(Meteors[c])-1)
  81.                     {
  82.                         int m = Meteors[c][i];
  83.                         if(R[r] >= L[r] && m >= L[r] && m <= R[r]) am += V[r];
  84.                         else if(R[r] < L[r] && (m >= L[r] || m <= R[r])) am += V[r];
  85.                     }
  86.                     if(am >= Goal[c])
  87.                     {
  88.                         Done[c] = r;
  89.                         break;
  90.                     }
  91.                 }
  92.             }
  93.         }
  94.  
  95.         A = B;
  96.     }
  97.  
  98.     f(i,1,N)
  99.         if(Done[i]) printf("%d\n", Done[i]);
  100.         else printf("NIE\n");
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement