Advertisement
Guest User

Untitled

a guest
Dec 5th, 2014
464
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<vector>
  5. using namespace std;
  6. #define mx 300005
  7. long long tree[mx];
  8. int n,m;
  9. int k;
  10. long long maxi=0;
  11. void update(int x, long long val){
  12.     while(x<=m){
  13.         tree[x]+=val;
  14.         //[x]=min(tree[x],maxi);
  15.         x+=(x&-x);
  16.        
  17.     }
  18. }
  19. long long read(int x){
  20.     long long s=0;
  21.     while(x>0){
  22.         s+=tree[x];
  23.         //s=min(tree[x],maxi);
  24.         x-=(x&-x);
  25.     }
  26.     return s;
  27. }
  28.  
  29. vector<int> V[mx], owned[mx];
  30. int l[mx],r[mx];
  31. long long a[mx];
  32. int ql[mx],qr[mx];
  33. long long val[mx];
  34. void apply(int x){
  35.     if(ql[x]<=qr[x])
  36.         update(ql[x],val[x]),update(qr[x]+1,-val[x]);
  37.     else{
  38.         update(1,val[x]);
  39.         update(qr[x]+1,-val[x]);
  40.         update(ql[x],val[x]);
  41.     }
  42. }
  43. int main(){
  44.     scanf("%d%d",&n,&m);
  45.     for(int i=1;i<=m;++i){
  46.         int tmp;
  47.         scanf("%d",&tmp);
  48.         owned[tmp].push_back(i);
  49.     }
  50.     for(int i=1;i<=n;++i)
  51.         {scanf("%lld",&a[i]);
  52.     maxi=max(a[i],maxi);
  53.     }
  54.     scanf("%d",&k);
  55.     for(int i=1;i<=k;++i)
  56.         scanf("%d%d%lld",&ql[i],&qr[i],&val[i]);
  57.     for(int i=1;i<=n;++i){
  58.         l[i]=1,r[i]=k+1;
  59.         V[(r[i]+l[i])/2].push_back(i);
  60.     }
  61.     bool change=1;
  62.     while(change){
  63.         memset(tree,0,sizeof(tree));
  64.         change=0;
  65.         for(int i=1;i<=k;++i){
  66.             apply(i);
  67.             int omar= V[i].size();
  68.             for(int j=0;j<omar;++j){
  69.                 long long tot=0;
  70.                 int x=V[i][j];
  71.                 int sz= owned[x].size();
  72.                 for(int I=0;I<sz;++I)
  73.                     {tot+=read(owned[x][I]);
  74.                 tot=min(tot,maxi);
  75.                 }
  76.                 if(tot>=a[x])r[x]=i-1;
  77.                 else l[x]=i+1;
  78.                 if(l[x]<=r[x]){
  79.                     V[(l[x]+r[x])/2].push_back(x);
  80.                     change=1;
  81.                 }
  82.             }
  83.             V[i].clear();
  84.         }
  85.     }
  86.     for(int i=1;i<=n;++i){
  87.         if(r[i]==k+1)puts("NIE");
  88.         else printf("%d\n",r[i]+1);
  89.     }
  90.     //system("pause");
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement