HDU4614

#include
#include
#include
#include
using namespace std;
const int maxn=100010;
struct point
{
    int l,r,flag,vis;//vis为1说明这个花盆可以放花,flag为1说明要向左右孩子更新
    int sum;//这个区间内有多少花盆可以放花
    int len()
       {
          return r-l+1;
       }
}T[4*maxn];
int n;
void build(int root,int l,int r)
{
    T[root].l=l;
    T[root].r=r;
    T[root].sum=T[root].len();
    T[root].vis=1;
    T[root].flag=0;
    if(l==r) return;
    int mid=(l+r)/2;
    build(2*root,l,mid);
    build(2*root+1,mid+1,r);
}
void l_r(int root)
{
    if(T[root].flag)
    {
        int ls=2*root,rs=2*root+1;
        T[ls].vis=T[root].vis;
        T[rs].vis=T[root].vis;
        T[ls].sum=T[root].vis?T[ls].len():0;
        T[rs].sum=T[root].vis?T[rs].len():0;
        T[ls].flag=T[rs].flag=1;
        T[root].flag=0;
    }
}
void updata(int root,int l,int r,int v)
{
    int ls=2*root,rs=2*root+1;
    if(T[root].l>r || T[root].r=l &&T[root].r<=r)
    {
        T[root].vis=v;
        T[root].sum=v?T[root].len():0;
        T[root].flag=1;
        return;
    }
    l_r(root);
    updata(ls,l,r,v);
    updata(rs,l,r,v);
    T[root].sum=T[ls].sum+T[rs].sum;
}
int query(int root,int l,int r)
{
        int ls=2*root,rs=2*root+1;
       if(T[root].l>r || T[root].r=l &&T[root].r<=r) return T[root].sum;
      l_r(root);
      return query(ls,l,r)+query(rs,l,r);
}
int Q(int l,int r,int va)//二分查找第一个和最后一个
{
    while(l

你可能感兴趣的:(杭电2013暑假多校第二场)