线段树区间求和
#include<iostream>
#include<cstdlib>
using namespace std;
#define MAXN 40005
struct Tree
{
int left,right;
int sum;
}tree[MAXN];
void build(int step,int l,int r)
{
int mid;
tree[step].left=l;
tree[step].right=r;
if (l==r)
{
tree[step].sum=1;
return;
}
mid=(l+r)>>1;
build(step<<1,l,mid);
build(step<<1)+1,mid+1,r);
tree[step].sum=tree[lz].sum+tree[rz].sum;
}
void updata(int step,int l,int r,int x,int y)
{
int mid;
if (l>y||r<x||tree[step].sum==0) return;
if ((x<=l)&&(y>=r))
{
tree[step].sum=0;
return;
}
mid=(l+r)>>1;
updata(step<<1,l,mid,x,y);
updata((step<<1)+1,mid+1,r,x,y);
tree[step].sum = tree[lz].sum+tree[rz].sum;
}
int main()
{
int len,m,i,z,y;
cin>>len>>m;
build(1,1,len+1);
for (i=1;i<=m;i++)
{
cin>>z>>y;
updata(1,1,len+1,z+1,y+1);
}
cout<<tree[1].sum;
return 0;
}