Description
Input
Output
Sample Input
3 1 1 2 2 3 3 3 1 1 1 2 1 3 0
Sample Output
1 1 1 3 2 1
/*
Author:2486
Memory: 3468 KB Time: 998 MS
Language: G++ Result: Accepted
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=100000+5;
int sum[maxn<<2],col[maxn<<2];
int N,a,b;
void pushup(int rt) {
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int rt,int m) {
if (col[rt]) {
col[rt<<1] += col[rt];
col[rt<<1|1] += col[rt];
sum[rt<<1] +=col[rt] * (m - (m >> 1));
sum[rt<<1|1] += col[rt] * (m >> 1);
col[rt] = 0;
}
}
void build(int rt,int l,int r) {
col[rt]=0;
if(l==r) {
sum[rt]=0;
return;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
}
void update(int L,int R,int c,int rt,int l,int r)
{
if(L<=l&&r<=R){
col[rt]+=c;
sum[rt]+=c*(r-l+1);
return ;
}
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
if(L<=mid)update(L,R,c,rt<<1,l,mid);
if(mid<R)update(L,R,c,rt<<1|1,mid+1,r);
pushup(rt);
}
int query(int L,int R,int rt,int l,int r)
{
if(L<=l&&r<=R){
return sum[rt];
}
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
int ret=0;
if(mid>=L)ret+=query(L,R,rt<<1,l,mid);
if(mid<R)ret+=query(L,R,rt<<1|1,mid+1,r);
return ret;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("D://imput.txt","r",stdin);
#endif // ONLINE_JUDGE
while(~scanf("%d",&N),N) {
build(1,1,N);
for(int i=0; i<N; i++) {
scanf("%d%d",&a,&b);
update(a,b,1,1,1,N);
}
for(int i=1;i<=N;i++){
if(i!=1)printf(" ");
printf("%d",query(i,i,1,1,N));
}
printf("\n");
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/qq_18661257/article/details/46789947