输入样例的时候是build有问题,在进入build的时候第二次就爆炸了,i莫名其妙很大一个
code:
#include<iostream>
using namespace std;
const int N=1e6+10;
int n,m,q,r,l;
struct node{
int l,r;
int val=0;
int lazy=0;
}tree[N<<2];
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0' || c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0' && c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
void build(int i,int l,int r){
tree[i].l=l,tree[i].r=r;
if(l==r) tree[i].val=0;
int mid=l+r>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
}
void push_down(int i){
if(!tree[i].lazy) return ;
tree[i<<1].lazy+=tree[i].lazy;
tree[i<<1].val+=tree[i].lazy*(tree[i<<1].r-tree[i<<1].l+1);
tree[i<<1|1].lazy+=tree[i].lazy;
tree[i<<1|1].val+=tree[i].lazy*(tree[i<<1|1].r-tree[i<<1|1].l+1);
tree[i].lazy=0;
}
void update(int i,int l,int r){
if(tree[i].l>r || tree[i].r<l) return;
if(tree[i].l<=l && tree[i].r>=r){
tree[i].val+=(l-r+1);
tree[i].lazy++;
}
update(i<<1,l,r);
update(i<<1|1,l,r);
}
int query(int i,int l,int r){
if(tree[i].l>r || tree[i].r<l) return 0;
if(tree[i].l<=l && tree[i].r>=r) return tree[i].val;
query(i<<1,l,r);
query(i<<1|1,l,r);
return tree[i].val;
}
int main(){
n=read(),m=read();
build(1,1,n);
for(int i=0;i<=m;i++){
q=read(),l=read(),r=read();
if(q==1) update(1,l,r);
if(q==2) printf("%d",query(1,l,r));
}
return 0;
}