Advertisement
Guest User

Untitled

a guest
Nov 24th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.02 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define FILL(X, V)           memset((X), (V), sizeof(X))
  5. #define SIZE(V)              int((V).size())
  6. #define FOR2(cont,start,max) for(int (cont) = (start), _MAX = (max); (cont) < _MAX; (cont)++)
  7. #define FOR(cont,max)        FOR2((cont), 0, (max))
  8. #define LOG(x)               (31 - __builtin_clz(x))
  9. #define W(x)                 cerr << "\033[31m" << #x << " = " << x << "\033[0m" << endl;
  10. #define Ws(x)                cerr << "\033[31m" << #x << "\033[0m" << endl;
  11. #define ii                   pair<int, int>
  12. #define ff                   first
  13. #define ss                   second
  14. #define oo                   1e9
  15. #define ep                   1e-9
  16. #define pb                   push_back
  17.  
  18. typedef long long ll;
  19. typedef unsigned long long ul;
  20.  
  21.  
  22.  
  23.  
  24. class SegTree_Max{
  25.     vector<int> st, st2, id;
  26.     vector<int> lazy;
  27.     int n;
  28.     void prop(int p, int L, int R){
  29.         if(lazy[p]){
  30.             st[p] += lazy[p];
  31.             lazy[2*p] += lazy[p];
  32.             lazy[2*p+1] += lazy[p];
  33.             lazy[p] = 0;
  34.         }
  35.     }
  36.  
  37.     void upd(int p, int L, int R, int i, int j, int v){
  38.         prop(p, L, R);
  39.  
  40.         if(j < L || i > R){
  41.             return;
  42.         }
  43.         if(i <= L && R <= j){
  44.             lazy[p] = v;
  45.             prop(p, L, R);
  46.             return;
  47.         }
  48.  
  49.         int mid = (L+R)/2;
  50.  
  51.         upd(2*p, L, mid, i, j, v);
  52.         upd(2*p+1, mid+1, R, i, j, v);
  53.  
  54.         st[p] = max(st[2*p],st[2*p+1]);
  55.     }
  56.    
  57.     int qry(int p, int L, int R, int i, int j){
  58.  
  59.         // W(p);
  60.         // W(L);
  61.         // W(R);
  62.         // W(i);
  63.         // W(j);
  64.  
  65.         prop(p, L, R);
  66.  
  67.         if(j < L || i > R){
  68.             // Ws(completely_out);
  69.             // W(0);
  70.             return -oo;
  71.         }
  72.         if(i <= L && R <= j){
  73.             // Ws(completely_in);
  74.             // W(st[p]);
  75.             return st[p];
  76.         }
  77.         // Ws(partially_in);
  78.  
  79.         int mid = (L+R)/2;
  80.  
  81.         return max(qry(2*p, L, mid, i, j), qry(2*p+1, mid+1, R, i, j));
  82.     }
  83. public:
  84.  
  85.     SegTree_Max(int sz){
  86.         n = sz;
  87.         st.assign(6*(n + 1), 0);
  88.         lazy.assign(6*(n + 1), 0);
  89.     }
  90.  
  91.     int qry(int i, int j){
  92.         return qry(1, 1, n, i, j);
  93.     }
  94.  
  95.     void upd(int i, int j, int v){
  96.         upd(1, 1, n, i, j, v);
  97.     }
  98. };
  99.  
  100.  
  101.  
  102. class SegTree_Sum{
  103.     vector<int> st, st2, id;
  104.     vector<int> lazy;
  105.     int n;
  106.     void prop(int p, int L, int R){
  107.         if(lazy[p]){
  108.             st[p] += lazy[p];
  109.             lazy[2*p] += lazy[p];
  110.             lazy[2*p+1] += lazy[p];
  111.             lazy[p] = 0;
  112.         }
  113.     }
  114.  
  115.     void upd(int p, int L, int R, int i, int j, int v){
  116.         prop(p, L, R);
  117.  
  118.         if(j < L || i > R) return;
  119.         if(i <= L && R <= j){
  120.             lazy[p] = v;
  121.             prop(p, L, R);
  122.             return;
  123.         }
  124.  
  125.         int mid = (L+R)/2;
  126.  
  127.         upd(2*p,   L,   mid, i, j, v);
  128.         upd(2*p+1, mid+1, R, i, j, v);
  129.  
  130.         int qryLo = st[2*p];
  131.         int qryHi = st[2*p+1];
  132.  
  133.         st[p] = qryLo + qryHi;
  134.     }
  135.    
  136.     int qry(int p, int L, int R, int i, int j){
  137.         prop(p, L, R);
  138.  
  139.         if(j < L || i > R) return 0;
  140.         if(i <= L && R <= j) return st[p];
  141.  
  142.         int mid = (L+R)/2;
  143.  
  144.         int qryLo = qry(2*p,   L,   mid, i, j);
  145.         int qryHi = qry(2*p+1, mid+1, R, i, j);
  146.  
  147.         return qryLo + qryHi;
  148.     }
  149. public:
  150.  
  151.     SegTree_Sum(int sz){
  152.         n = sz;
  153.         st.assign(6*(n + 1), 0);
  154.         lazy.assign(6*(n + 1), 0);
  155.     }
  156.  
  157.     int qry(int i, int j){
  158.         return qry(1, 1, n, i, j);
  159.     }
  160.  
  161.     void upd(int i, int j, int v){
  162.         upd(1, 1, n, i, j, v);
  163.     }
  164. };
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172. int main() {
  173.     ios::sync_with_stdio(false);
  174.     int n,d,x,tot = 0;
  175.     cin >> n >> d;
  176.  
  177.     // W(n);
  178.     // W(d);
  179.  
  180.     SegTree_Sum st_sum(n);//st_sum é a soma dos x no intervalo com os depositos calculados
  181.     SegTree_Max st_max(n);//st_max é o maior valor de st_sum[1,i] no intervalo
  182.     vector<int> v(n+1);
  183.  
  184.     FOR2(i,1,n+1){
  185.         cin >> x;
  186.         v[i] = x;
  187.         // W(i);
  188.         // W(x);
  189.         st_sum.upd(i,i,x);
  190.         st_max.upd(i,i,st_sum.qry(1,i));
  191.         // W(st_sum.qry(1,i));
  192.         // W(st_max.qry(1,i));
  193.         if(st_sum.qry(1,i) > d){
  194.             cout << -1 << endl;
  195.             return 0;
  196.         }
  197.     }
  198.     FOR2(i,1,n+1){
  199.         int val = st_sum.qry(1,i);
  200.         if(v[i] == 0 && val < 0){
  201.             int mx = st_max.qry(i+1,n);
  202.             // W(val);
  203.             // W(mx);
  204.             mx = d - mx;//maior depósito possivel que não faça nenhum que vem depois estourar o limite
  205.             // W(mx);
  206.             if(val + mx < 0){
  207.                 cout << -1 << endl;
  208.                 return 0;
  209.             }
  210.             st_sum.upd(i,i,mx);
  211.             st_max.upd(i,i,-1*st_max.qry(i,i));
  212.             st_max.upd(i,i,st_sum.qry(1,i));
  213.             tot++;
  214.         }
  215.     }
  216.     cout << tot << endl;
  217.     return 0;
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement