BZOJ_2527_[Poi2011]Meteors_ Overall two points

BZOJ_2527_[Poi2011]Meteors_ Overall two points

Description

Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The planet is unsuitable for colonisation due to strange meteor showers, which on the other hand make it an exceptionally interesting object of study.
The member states of BIU have already placed space stations close to the planet's orbit. The stations' goal is to take samples of the rocks flying by. The BIU Commission has partitioned the orbit into msectors, numbered from 1to m, where the sectors 1and mare adjacent. In each sector there is a single space station, belonging to one of the nmember states.
Each state has declared a number of meteor samples it intends to gather before the mission ends. Your task is to determine, for each state, when it can stop taking samples, based on the meter shower predictions for the years to come.
The Byeotian Interstellar Union has N member states. Now it has discovered a new planet, the orbit of this planet is divided into M parts (the M part is adjacent to the 1 part), and the i part has the space station of the Ai country.
The planet often rains meteorites. BIU has predicted the next K-field meteorite shower.
The i-th member state of the BIU hopes to be able to collect Pi units of meteorite samples. Your task is to determine for each country it needs to collect enough meteors after the first meteor shower.
enter:
The first line is two numbers N, M.
The second line has M numbers, and the i-th number Oi indicates that there is a space station of the Oi-th country on the i-th orbit.
The third line has N numbers, and the ith number Pi represents the number of meteorites that the ith country wishes to collect.
The fourth row has a number K, indicating that BIU predicts the next K-field meteor shower.
Next K lines, each line has three numbers Li, Ri, Ai, indicating that the location of the K-th meteorite shower is in the clockwise interval from Li to Ri (if Li<=Ri, it is Li,Li+1,. ..,Ri, otherwise Ri,Ri+1,...,m-1,m,1,...,Li), providing a meteorite sample of Ai units to each space station in the interval.
output:
N lines. The number Wi in the i-th row indicates that the i-th country can collect enough meteorite samples after the Wi-th meteor shower. If it is still not collected after the end of the Kth wave, output NIE.
data range:
Data range: 1<=n,m,k<=3*10^5 1<=Pi<=10^9 1<=Ai<10^9

Input

The first line of the standard input gives two integers, n and m(1<=n,m<=3*10^5) separated by a single space, that denote, respectively, the number of BIU member states and the number of sectors the orbit has been partitioned into.
In the second line there are mintegers Oi(1<=Oi<=n) separated by single spaces, that denote the states owning stations in successive sectors.
In the third line there are nintegers Pi(1<=Pi<=10^9) separated by single spaces, that denote the numbers of meteor samples that the successive states intend to gather.
In the fourth line there is a single integer k(1<=k<=3*10^5) that denotes the number of meteor showers predictions. The following klines specify the (predicted) meteor showers chronologically. The i-th of these lines holds three integers Li, Ri, Ai(separated by single spaces), which denote that a meteor shower is expected in sectors Li,Li+1,…Ri (if Li<=Ri) or sectors Li,Li+1,…,m,1,…Ri (if Li>Ri), which should provide each station in those sectors with Aimeteor samples (1<=Ai<10^9).
In tests worth at least 20% of the points it additionally holds that .

Output

 
Your program should print nlines on the standard output. The i-th of them should contain a single integer Wi, denoting the number of shower after which the stations belonging to the i-th state are expected to gather at least Pi samples, or the word NIE (Polish for no) if that state is not expected to gather enough samples in the foreseeable future.

Sample Input

3 5
1 3 2 1 3
10 5 7
3
4 2 4
1 3 1
3 5 2

Sample Output

3
NO
1


 Overall two points.

solve(b,e,l,r) means to process the query from b to e, and the answer is in the interval from l to r.

Divide the mid, and add the meteorites between l and mid.

Use tree array to maintain interval plus single point summation.

Go left if the answer is on the left, otherwise go right after subtracting the contribution from the left.

 

Code:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 300050
int n,m,c[N],ans[N],head[N],to[N],nxt[N],cnt,k;
inline void add(int u,int v) {
    to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
}
struct A {
    int id,v;
}q[N],t[N];
struct P {
    int l,r,v;
}a[N];
void fix(int x,int v){for(;x<=m;x+=x&(-x)) c[x]+=v;}
int inq(int x){int re=0;for(;x;x-=x&(-x)) re+=c[x]; return re;}
void solve(int b,int e,int l,int r) {
    if(b>e) return ;
    int i,mid=(l+r)>>1,lp=b,rp=e,j;
    if(l==r) {
        for(i=b;i<=e;i++) ans[q[i].id]=l;
        return ;
    }
    for(i=l;i<=mid;i++) {
        if(a[i].l<=a[i].r) {
            fix(a[i].l,a[i].v); fix(a[i].r+1,-a[i].v);
        }else {
            fix(1,a[i].v); fix(a[i].r+1,-a[i].v);
            fix(a[i].l,a[i].v);
        }
    }
    for(i=b;i<=e;i++) {
        int sizls=0;
        for(j=head[q[i].id];j;j=nxt[j]) {
            int pos=to[j]-n;
            sizls+=inq(pos);
            if(sizls>=q[i].v) break;
        }
        if(sizls>=q[i].v||sizls<0) t[lp++]=q[i];
        else q[i].v-=sizls,t[rp--]=q[i];
    }
    for(i=b;i<=e;i++) q[i]=t[i];
    for(i=l;i<=mid;i++) {
        if(a[i].l<=a[i].r) {
            fix(a[i].l,-a[i].v); fix(a[i].r+1,a[i].v);
        }else {
            fix(1,-a[i].v); fix(a[i].r+1,a[i].v);
            fix(a[i].l,-a[i].v);
        }
    }
    solve(b,rp,l,mid);
    solve(lp,e,mid+1,r);
}
int main() {
    scanf("%d%d",&n,&m);
    int i,x;
    for(i=1;i<=m;i++) {
        scanf("%d",&x);
        add(x,i+n);
    }
    for(i=1;i<=n;i++) {
        scanf("%d",&q[i].v); q[i].id=i;
    }
    scanf("%d",&k);
    for(i=1;i<=k;i++) {
        scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].v);
    }
    solve(1,n,1,k+1);
    for(i=1;i<=n;i++) {
        if(ans[i]<=k) printf("%d\n",ans[i]);
        else puts("NIE");
    }
}

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325045841&siteId=291194637