Wikilo 1191线段树区间修改单点查询

来源:互联网 发布:中国对外援助知乎 编辑:程序博客网 时间:2024/05/16 16:00

这题也算比较容易的了。

如果哪个区间已经没有黑色的话,就不用update了,就是因为这个原因WA了2发,唉……

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <deque>#include <vector>#include <queue>#include <string>#include <cstring>#include <map>#include <stack>#include <set>#define PI acos(-1.0)#define mem(a,b) memset(a,b,sizeof(a))#define sca(a) scanf("%d",&a)#define sc(a,b) scanf("%d%d",&a,&b)#define pri(a) printf("%d\n",a)#define lson i<<1,l,mid#define rson i<<1|1,mid+1,r#define MM 2000004#define MN 1008#define INF 2000000000#define eps 1e-8using namespace std;typedef long long ll;typedef unsigned long long ULL;ll sum[MM];int val[MM];void pushUp(int i){    sum[i]=sum[i<<1]+sum[i<<1|1];}void pushDown(int i){    if(val[i])    {        sum[i]=sum[i<<1]=sum[i<<1|1]=0;        val[i]=0;    }}void build(int i,int l,int r){    if(l==r)    {        sum[i]=1;        return ;    }    int mid=(l+r)>>1;    build(lson),build(rson);    pushUp(i);}void update(int i,int l,int r,int L,int R){    if(L<=l&&r<=R)    {        val[i]=1;        sum[i]=0;        return ;    }    int mid=(l+r)>>1;    pushDown(i);    if(sum[i]) //如果这个i的区间已经为0就不用再进行下去了    {        if(L>mid) update(rson,L,R);        else if(R<=mid) update(lson,L,R);        else        {            update(lson,L,mid);            update(rson,mid+1,R);        }    }    pushUp(i);}int main(){    int n,m,l,r;    sc(n,m);    build(1,1,n);    while(m--)    {        sc(l,r);        update(1,1,n,l,r);        printf("%lld\n",sum[1]);    }    return 0;}


0 0