Advertisement
Jaydeep999997

Meteors

Oct 8th, 2020
834
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.21 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long double ld;
  5. typedef long long int ll;
  6. typedef pair<int,int> pi;
  7. typedef pair<long long,long long> pll;
  8.  
  9. #define endl '\n'
  10. #define ff first
  11. #define ss second
  12. #define pb push_back
  13. #define int long long
  14. #define sz(v) (int)v.size()
  15. #define inf 2147483647
  16. #define llinf 9223372036854775807
  17. #define all(v) v.begin(),v.end()
  18. #define bp(n) __builtin_popcountll(n)
  19. #define f(i,l,r) for(long long i=l;i<=r;i++)
  20. #define rf(i,r,l) for(long long i=r;i>=l;i--)
  21. #define fast ios_base::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
  22.  
  23. template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { os << '{'; string sep; for (const auto &x : v) os << sep << x, sep = ", "; return os << '}'; }
  24. template<typename T, size_t size> ostream& operator<<(ostream &os, const array<T, size> &arr) { os << '{'; string sep; for (const auto &x : arr) os << sep << x, sep = ", "; return os << '}'; }
  25. template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
  26.  
  27. void dbg_out() { cerr << endl; }
  28. template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }
  29.  
  30.  
  31. const int N=3e5+5,mod=1e9+7,bit=61;
  32.  
  33. template<typename T>
  34. class fenwick
  35. {
  36.     public:
  37.         vector<T> fen;
  38.         int n;
  39.  
  40.         fenwick() {}
  41.  
  42.         fenwick(int _n,T val=T())
  43.         {
  44.             n=_n;
  45.             fen=vector<T> (n+1,val);
  46.         }
  47.  
  48.         void reset()
  49.         {
  50.             for(int i=0;i<(int)fen.size();i++)
  51.             {
  52.                 fen[i]=(T)0;
  53.             }
  54.         }
  55.  
  56.         T merge(T a,T b)
  57.         {
  58.             return a+b;
  59.         }
  60.  
  61.         void update(int idx,T val)
  62.         {
  63.             while(idx<=n)
  64.             {
  65.                 fen[idx]=merge(fen[idx],val);
  66.                 idx+=(idx & -idx);
  67.             }
  68.         }
  69.  
  70.         T query(int idx)
  71.         {
  72.             T ans{};
  73.             while(idx>0)
  74.             {
  75.                 ans=merge(ans,fen[idx]);
  76.                 idx-=(idx & -idx);
  77.             }
  78.             return ans;
  79.         }
  80.  
  81.         T from(int l,int r)
  82.         {
  83.             return query(r)-query(l-1);
  84.         }
  85. };
  86.  
  87. vector<int> mid[N],adj[N];
  88. int req[N],l[N],r[N],s[N],e[N],add[N],n,m,q;
  89. fenwick<int> obj;
  90.  
  91. void apply(int x)
  92. {
  93.     if(s[x]<=e[x])
  94.     {
  95.         obj.update(s[x],add[x]);
  96.         obj.update(e[x]+1,-add[x]);
  97.     }
  98.     else
  99.     {
  100.         obj.update(1,add[x]);
  101.         obj.update(e[x]+1,-add[x]);
  102.         obj.update(s[x],add[x]);
  103.     }
  104. }
  105.  
  106. signed main()
  107. {
  108.     fast;
  109.  
  110.     cin>>n>>m;
  111.  
  112.     obj = fenwick<int> (m);
  113.  
  114.     for(int i=1;i<=m;i++)
  115.     {
  116.         int p;
  117.         cin>>p;
  118.         adj[p].push_back(i);
  119.     }
  120.  
  121.     for(int i=1;i<=n;i++)
  122.     {
  123.         cin>>req[i];
  124.     }
  125.  
  126.     cin>>q;
  127.     for(int i=1;i<=q;i++)
  128.     {
  129.         cin>>s[i]>>e[i]>>add[i];
  130.     }
  131.  
  132.     for(int i=1;i<=n;i++)
  133.     {
  134.         l[i]=1;
  135.         r[i]=q+1;
  136.     }
  137.  
  138.     bool done=0;
  139.     while(!done)
  140.     {
  141.         done=1;
  142.         obj.reset();
  143.         for(int i=1;i<=n;i++)
  144.         {
  145.             if(l[i]!=r[i])
  146.             {
  147.                 done=0;
  148.                 mid[(l[i]+r[i])>>1].push_back(i);
  149.             }
  150.         }
  151.  
  152.         for(int i=1;i<=q;i++)
  153.         {
  154.             apply(i);
  155.             while(!mid[i].empty())
  156.             {
  157.                 int par=mid[i].back();
  158.                 int sum=0;
  159.                 bool sat=0;
  160.                 for(auto &v:adj[par])
  161.                 {
  162.                     sum+=obj.query(v);
  163.                     if(sum >= req[par])
  164.                     {
  165.                         sat=1;
  166.                         break;
  167.                     }
  168.                 }
  169.                 if(sat)
  170.                 {
  171.                     r[par]=i;
  172.                 }
  173.                 else
  174.                 {
  175.                     l[par]=i+1;
  176.                 }
  177.                 mid[i].pop_back();
  178.             }
  179.         }
  180.     }
  181.  
  182.     for(int i=1;i<=n;i++)
  183.     {
  184.         assert(l[i] == r[i]);
  185.         if(r[i] <= q)
  186.         {
  187.             cout<<r[i]<<endl;
  188.         }
  189.         else
  190.         {
  191.             cout<<"NIE"<<endl;
  192.         }
  193.     }
  194.     return 0;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement