1. 程式人生 > >藍橋杯 校外的樹 線段樹

藍橋杯 校外的樹 線段樹

#include <iostream>
#include <stdio.h>
#define N 10010
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;

int n, m;
int sum[N << 2];
bool lazy[N << 2];
void up(int rt)
{
    if (lazy[rt])
    {
        lazy[rt<<1] = lazy[rt<<1|1] = lazy[rt];
        sum[rt<<1] = sum[rt<<1|1] = 0;
        lazy[rt] = false;
    }
}

void build(int l, int r, int rt)
{
    lazy[rt] = false;
    if (l == r)
    {
        sum[rt] = 1;
        return ;
    }
    int mid = (l + r) >> 1;
    build(lson);
    build(rson);
    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}

void update(int L, int R, int l, int r, int rt)
{
    if (L <= l && r <= R)
    {
        lazy[rt] = true;
        sum[rt] = 0;
        return ;
    }
    up(rt);
    int mid = (l + r) >> 1;
    if (L <= mid)
        update(L, R, lson);
    if (R > mid)
        update(L, R, rson);
    sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}

int main()
{
    scanf("%d%d", &n, &m);
    build(0, n, 1);
    while (m--)
    {
        int l, r;
        scanf("%d%d", &l, &r);
        update(l, r, 0, n, 1);
    }
    printf("%d\n", sum[1]);

    return 0;
}