以下代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std ;
#define int long long
#define lson ( pos << 1 )
#define rson ( pos << 1 | 1 )
//由于取反的性质,所以当两次取反就相当于没取反
//所以只需要记录取反的次数就行了
struct SegTree{
int sum ;
int lz ;
};
SegTree tre[400005] ;
void pushup( int pos ){
tre[pos].sum = tre[lson].sum + tre[rson].sum ;
return ;
}
void build( int pos , int l , int r ){
tre[pos].lz = 0 ;
tre[pos].sum = 0 ;
}
void pushdown( int pos , int l , int r ){
if( tre[pos].lz != 0 ){
int mid ;
mid = ( l + r ) >> 1 ;
tre[lson].lz += tre[pos].lz ;
tre[rson].lz += tre[pos].lz ;
tre[lson].sum = ( mid - l + 1 - tre[lson].sum );
tre[rson].sum = ( l - mid - tre[rson].sum );
}
tre[pos].lz = 0 ;
return ;
}
void update( int pos , int l , int r , int ql , int qr ){
if( ql <= l && r <= qr ){
tre[pos].lz ++ ;
tre[pos].sum = ( r - l + 1 - tre[pos].sum );
return ;
}
pushdown( pos , l , r );
int mid = ( l + r ) >> 1 ;
if( ql <= mid ){
update( lson , l , mid , ql , qr );
}
if( qr > mid ){
update( rson , mid+1 , r , ql , qr );
}
pushup( pos );
return ;
}
int query( int pos , int l , int r , int x ){
if( l == r ){
return tre[pos].sum ;
}
int mid = ( l + r )>> 1 ;
if( x <= mid ){
query( lson , l , mid , x );
}else{
query( rson , mid+1 , r , x );
}
}
int n , m , t ;
signed main(){
int l , r , ii ;
scanf("%d%d" , &n , &m );
for( int i = 1 ; i <= n ; i ++ ){
scanf("%d" , &t );
if( t == 1 ){
scanf("%d%d" , &l , &r );
update( 1 , 1, n , l , r );
cout << "test" << endl;
}
if( t == 2 ){
scanf("%d%" , &ii );
int ans ;
ans = query( 1 , 1 , n , ii ) ;
cout << ans << endl;
}
}
return 0 ;
}
感谢大佬!!好人一生平安!!