不知道为啥。
样例输出
1
0
# include <cstdio>
# include <iostream>
# include <algorithm>
namespace IO{
inline int read(){
int res = 0 , ti = 1;
char c = getchar();
while( ! isdigit( c ) ){ if( c == '-' ) ti = -1; c = getchar(); }
while( isdigit( c ) ) res = res * 10 + c - '0' , c = getchar();
return res * ti;
}
}
using namespace std;
const int N = 5e5 + 225;
struct Operations{ int l , r , v , op , id; }a[ N ] , t[ N ];
int s;
int n , q;
int T[ N ];
inline int lowbit( int x ){ return x & ( -x ); }
void Modify( int p , int x ){ for( int i = p ; i <= n ; i += lowbit( i ) ) T[ i ] += x; }
int Query( int p ){
int res = 0;
for( int i = p ; i ; i -= lowbit( i ) ) res += T[ i ];
return res;
}
int ans[ N ];
Operations Ql[ N ] , Qr[ N ];
void Solve( int l , int r , int p , int q ){
if( p > q ) return;
if( l == r ){
for( int i = p ; i <= q ; i ++ )
if( ! a[ i ] . op ) ++ ans[ l ];
return;
}
int mid = l + r >> 1;
int cl = 0 , cr = 0;
for( int i = p ; i <= q ; i ++ ){
if( a[ i ] . op ){
if( a[ i ] . v <= mid ) Modify( a[ i ] . l , 1 ) , Ql[ ++ cl ] = a[ i ];
else Qr[ ++ cr ] = a[ i ];
}
else{
int res = Query( a[ i ] . r ) - Query( a[ i ] . l - 1 );
if( a[ i ] . v <= res ) Ql[ ++ cl ] = a[ i ];
else a[ i ] . v -= res , Qr[ ++ cr ] = a[ i ];
}
}
for( int i = 1 ; i <= cl ; i ++ )
if( Ql[ i ] . op ) Modify( Ql[ i ] . l , -1 );
for( int i = 1 ; i <= cl ; i ++ ) a[ p + i - 1 ] = Ql[ i ];
for( int i = 1 ; i <= cr ; i ++ ) a[ p + cl + i - 1 ] = Qr[ i ];
Solve( l , mid , p , p + cl - 1 ) , Solve( mid + 1 , r , p + cl , q );
}
void Input(){
n = IO :: read() , q = IO :: read();
for( int i = 1 ; i <= n ; i ++ ) t[ i ] . l = IO :: read() , t[ i ] . r = IO :: read() , t[ i ] . v = IO :: read();
for( int i = 1 ; i <= q ; i ++ )
a[ ++ s ] . l = IO :: read() , a[ s ] . v = i , a[ s ] . op = 1;
for( int i = 1 ; i <= n ; i ++ ){
a[ ++ s ] . l = t[ i ] . l , a[ s ] . r = t[ i ] . r , a[ s ] . v = t[ i ] . v;
a[ s ] . op = 0;
}
}
int main(){
Input();
Solve( 1 , q + 1 , 1 , s );
for( int i = 1 ; i <= q ; i ++ ) printf( "%d\n" , ans[ i ] );
return 0;
}