// https://oj.uz/problem/view/IZhO12_apple
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int inf = 1e9 + 10;
class LazyDynamicSegtree{
private:
ll min_id, max_id;
struct Node{
int val, lazy, l, r;
Node() : val(0), l(0), r(0), lazy(0) {}
};
vector<Node> seg;
int create(){
seg.emplace_back();
return seg.size() - 1;
}
int l( int pos ){
if( seg[pos].l == 0 ){ int aux = create(); seg[pos].l = aux; }
return seg[pos].l;
}
int r( int pos ){
if( seg[pos].r == 0 ){ int aux = create(); seg[pos].r = aux; }
return seg[pos].r;
}
void refresh( int pos, ll ini, ll fim ){
if( seg[pos].lazy == 0 ) return;
int x = seg[pos].lazy; seg[pos].lazy = 0;
seg[pos].val = 1LL*x*(fim - ini + 1);
if( ini == fim ) return;
l(pos); r(pos);
seg[l(pos)].lazy = x;
seg[r(pos)].lazy = x;
}
void update( int pos, ll ini, ll fim, ll ki, ll kf, int val ){
refresh( pos, ini, fim );
if( ki > fim || ini > kf ) return;
if( ki <= ini && fim <= kf ){
seg[pos].lazy = val;
refresh( pos, ini, fim );
return;
}
ll mid = (ini + fim)>>1;
update( l(pos), ini, mid, ki, kf, val ); update( r(pos), mid + 1, fim, ki, kf, val );
seg[pos].val = seg[seg[pos].l].val + seg[seg[pos].r].val;
}
int query( int pos, ll ini, ll fim, ll ki, ll kf ){
refresh( pos, ini, fim );
if( ki > fim || ini > kf ) return 0;
if( ki <= ini && fim <= kf ) return seg[pos].val;
ll mid = (ini + fim)>>1;
return query( l(pos), ini, mid, ki, kf ) + query( r(pos), mid + 1, fim, ki, kf );
}
public:
LazyDynamicSegtree( ll min_id, ll max_id ){ create(); create(); }
void update( ll l, ll r, int val ){ update( 1, min_id, max_id, l, r, val ); }
int query( ll l, ll r ){ return query( 1, min_id, max_id, l, r ); }
};
int main(){
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int q; cin >> q;
LazyDynamicSegtree seg( 0, inf );
int c = 0;
while( q-- ){
int t, l, r; cin >> t >> l >> r;
l += c; r += c;
if( t == 1 ){
c = seg.query( l, r );
cout << c << endl;
}
else seg.update( l, r, 1 );
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |