Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #include<vector>
- using namespace std;
- #define mx 300005
- long long tree[mx];
- int n,m;
- int k;
- long long maxi=0;
- void update(int x, long long val){
- while(x<=m){
- tree[x]+=val;
- //[x]=min(tree[x],maxi);
- x+=(x&-x);
- }
- }
- long long read(int x){
- long long s=0;
- while(x>0){
- s+=tree[x];
- //s=min(tree[x],maxi);
- x-=(x&-x);
- }
- return s;
- }
- vector<int> V[mx], owned[mx];
- int l[mx],r[mx];
- long long a[mx];
- int ql[mx],qr[mx];
- long long val[mx];
- void apply(int x){
- if(ql[x]<=qr[x])
- update(ql[x],val[x]),update(qr[x]+1,-val[x]);
- else{
- update(1,val[x]);
- update(qr[x]+1,-val[x]);
- update(ql[x],val[x]);
- }
- }
- int main(){
- scanf("%d%d",&n,&m);
- for(int i=1;i<=m;++i){
- int tmp;
- scanf("%d",&tmp);
- owned[tmp].push_back(i);
- }
- for(int i=1;i<=n;++i)
- {scanf("%lld",&a[i]);
- maxi=max(a[i],maxi);
- }
- scanf("%d",&k);
- for(int i=1;i<=k;++i)
- scanf("%d%d%lld",&ql[i],&qr[i],&val[i]);
- for(int i=1;i<=n;++i){
- l[i]=1,r[i]=k+1;
- V[(r[i]+l[i])/2].push_back(i);
- }
- bool change=1;
- while(change){
- memset(tree,0,sizeof(tree));
- change=0;
- for(int i=1;i<=k;++i){
- apply(i);
- int omar= V[i].size();
- for(int j=0;j<omar;++j){
- long long tot=0;
- int x=V[i][j];
- int sz= owned[x].size();
- for(int I=0;I<sz;++I)
- {tot+=read(owned[x][I]);
- tot=min(tot,maxi);
- }
- if(tot>=a[x])r[x]=i-1;
- else l[x]=i+1;
- if(l[x]<=r[x]){
- V[(l[x]+r[x])/2].push_back(x);
- change=1;
- }
- }
- V[i].clear();
- }
- }
- for(int i=1;i<=n;++i){
- if(r[i]==k+1)puts("NIE");
- else printf("%d\n",r[i]+1);
- }
- //system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement