POJ 3580 splay

来源:互联网 发布:淘宝开店费用明细 编辑:程序博客网 时间:2024/06/01 09:25
#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define mxn 100020#define ls ( p[i].ch[0] )#define rs ( p[i].ch[1] )struct node {int ch[2];int val, add, s, mi;    bool flip;void set( int x ) {ch[0] = ch[1] = 0;val = x, s = 1;mi = x;add = flip = 0;}}p[mxn*2];int sz;void down( int i ) {if( p[i].add ) {if( ls )p[ls].add += p[i].add, p[ls].val += p[i].add, p[ls].mi += p[i].add;if( rs )p[rs].add += p[i].add, p[rs].val += p[i].add, p[rs].mi += p[i].add;p[i].add = 0;}if( p[i].flip ) {swap( ls, rs );p[ls].flip ^= 1;p[rs].flip ^= 1;p[i].flip = 0;}}void mt( int i ) {p[i].s = 1, p[i].mi = p[i].val;if( ls )p[i].s += p[ls].s, p[i].mi = min( p[i].mi, p[ls].mi );if( rs )p[i].s += p[rs].s, p[i].mi = min( p[i].mi, p[rs].mi );}int cmp( int i, int k ) {if( ls )k -= p[ls].s;if( k == 1 )return -1;return k <= 0? 0: 1;}void rt( int &i, int d ) {int k = p[i].ch[d^1];p[i].ch[d^1] = p[k].ch[d];p[k].ch[d] = i;mt( i );mt( k );i = k;}void splay( int &i, int k ) {down( i );int d = cmp( i, k );if( d == 1 )if( ls )k -= p[ls].s + 1;elsek --;if( ~d ) {int o = p[i].ch[d];down( o );int d2 = cmp( o, k );if( ~d2 ) {if( d2 == 1 ) if( p[o].ch[0] )k -= p[p[o].ch[0]].s + 1;elsek --;splay( p[o].ch[d2], k );if( d == d2 )rt( i, d ^ 1 );elsert( p[i].ch[d], d );}rt( i, d ^ 1 );}}void split( int i, int k, int &left, int &right ) { splay( i, k ); left = i; right = rs; p[i].ch[1] = 0; mt( i );}int merge( int i, int o ) {splay( i, p[i].s );p[i].ch[1] = o;mt( i );return i;}int creat( int x ) {++sz;p[sz].set( x );return sz;}int n, a[mxn], root;int build( int ll, int rr ) {if( ll > rr )return 0;int md = ( ll + rr ) >> 1;int tmp = build( ll, md - 1 );int ret = creat( a[md] );p[ret].ch[0] = tmp;p[ret].ch[1] = build( md + 1, rr );mt( ret );return ret;}void read() {sz = 0;root = creat( -1 );for( int i = 1; i <= n; ++i )scanf( "%d", &a[i] );p[root].ch[1] = build( 1, n );mt( root );}int main() {//freopen( "tt.txt", "r", stdin );while( scanf( "%d", &n ) != EOF ) {read();scanf( "%d", &n );while( n-- ) {char s[10];int l, r, val;int left, right, mid;scanf( "%s", s );if( s[0] == 'A' ) {scanf( "%d%d%d", &l, &r, &val );split( root, l, left, mid );split( mid, r - l + 1, root, right );p[root].add += val;p[root].val += val;p[root].mi += val;root = merge( left, root );root = merge( root, right );}if( s[0] == 'R' && s[3] == 'E' ) {scanf( "%d%d", &l, &r );split( root, l, left, mid );split( mid, r - l + 1, root, right );p[root].flip ^= 1;root = merge( left, root );root = merge( root, right );}if( s[0] == 'R' && s[3] == 'O' ) {scanf( "%d%d%d", &l, &r, &val );int tmp;val %= ( r - l + 1 );if( !val )continue;split( root, l, left, mid );split( mid, r - l + 1, tmp, right );split( tmp, r - l + 1 - val, root, mid );root = merge( mid, root );root = merge( left, root );root = merge( root, right );}if( s[0] == 'I' ) {scanf( "%d%d", &l, &val );split( root, l + 1, left, right );mid = creat( val );root = merge( left, mid );root = merge( root, right );}if( s[0] == 'D' ) {scanf( "%d%d", &l, &val );split( root, l, left, right );split( right, 1, mid, root );root = merge( left, root );}if( s[0] == 'M' ) {scanf( "%d%d", &l, &r );split( root, l, left, mid );split( mid, r - l + 1, root, right );printf( "%d\n", p[root].mi );root = merge( left, root );root = merge( root, right );}}}return 0;}

0 0
原创粉丝点击