void build(int r,int L,int R)
{
if(L==R) sum[1] = 1;
else{
int M = (L+R)/2;
build(r*2,L,M);
build(r*2+1,M+1,R);
sum[r] = sum[r*2] + sum[r*2+1];
}
}
void push_up(int r,int L,int R)
{
if(lazy[r]>0)
{
sum[r] = lazy[r]*(R-L+1);
}
else
{
sum[r] = sum[r*2] + sum[r*2+1];
}
}
void push_down(int r)
{
if(lazy[r]>0)
{
lazy[r*2] = lazy[r*2+1] = lazy[r];
lazy[r] = 0;
}
}
void update(int r,int L,int R,int ql,int qr,int val)
{
if(ql<=L&&R<=qr)
{
lazy[r] = val;
sum[r] = val*(R-L+1);
}
else
{
int M=(L+R)/2;
if(ql<=M) update(r*2,L,M,ql,qr,val);
else push_up(r*2,L,M);
if(qr>M) update(r*2+1,M+1,R,ql,qr,val);
else push_up(r*2+1,M+1,R);
push_up(r,L,M);
}
}
void query(int r,int L,int R,int ql,int qr)
{
if(lazy[r]>0)
total += lazy[r]*(min(R,qr)-max(L,ql)+1);
else if(ql<=L&&R<=qr)
total += sum[r];
else
{
int M = (L+R)/2;
if(ql<=M)
query(r*2,L,M,ql,qr);
if(qr>=M)
quert(r*2+1,M+1,R,ql,qr);
}
}