线段树

#include <stdio.h>
#include <string.h>
const int MAX = 10000+10;
int n, m;
struct node
{
int l;
int r;
int sum;
}a[MAX<<2];

void pushup(int root)
{
a[root].sum = a[root<<1].sum + a[root<<1|1].sum;
}
void build(int l, int r, int root)
{
a[root].l = l;
a[root].r = r;
a[root].sum = r - l + 1;
if (l == r)
{
  return;
}
int mid = (l + r)>>1;
build(l, mid, root<<1);
build(mid+1, r, root<<1|1);
}
void update(int l, int r, int root)
{
if (a[root].sum == 0)
{
  return;
}
if (a[root].l == l && a[root].r == r)
{
  a[root].sum  = 0;
  return;
}
int mid = (a[root].l + a[root].r)>>1;
if (r<=mid)
{
  update(l, r, root<<1);
}
else if (l>mid)
{
  update(l, r, root<<1|1);
}
else
{
  update(l, mid, root<<1);
  update(mid+1, r, root<<1|1);
}

pushup(root);
}
int main()
{
int l, r;
while (scanf("%d%d", &n, &m) == 2)
{
  build(1, n+1, 1);
  while (m--)
  {
   scanf("%d%d", &l, &r);
   update(++l, ++r, 1);
  }
  printf("%d\n", a[1].sum);
}
return 0;
}

 

posted @ 2013-10-06 14:58  小薇林  阅读(178)  评论(1编辑  收藏  举报