Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- struct tree{
- int sz = 1, y = rand(), ans = 2e9;
- tree *l = nullptr, *r = nullptr;
- int rev = 0, val;
- tree(int a){
- val = a;
- ans = a;
- }
- };
- void print(tree *v){
- if(v == nullptr) return;
- print(v->l);
- cout<<v->val<<" ";
- print(v->r);
- }
- void push(tree *t){
- if(t == nullptr) return;
- if(t->rev == 0) return;
- swap(t->l, t->r);
- t->rev = 0;
- if(t->l != nullptr){
- t->l->rev ^= 1;
- }
- if(t->r != nullptr){
- t->r->rev ^= 1;
- }
- }
- void upd(tree *t){
- if(t == nullptr){
- return;
- }
- push(t);
- t->ans = t->val;
- t->sz = 1;
- if(t->l != nullptr){
- t->sz += t->l->sz;
- t->ans = min(t->ans, t->l->ans);
- }
- if(t->r != nullptr){
- t->sz += t->r->sz;
- t->ans = min(t->ans, t->r->ans);
- }
- }
- int getsz(tree *t){
- if(t == nullptr) return 0;
- return t->sz;
- }
- void merge(tree *&t, tree *l, tree *r){
- upd(l);
- upd(r);
- if(l == nullptr){
- t = r;
- }
- else if(r == nullptr){
- t = l;
- }
- else if(l->y > r->y){
- merge(l->r, l->r, r);
- t = l;
- }
- else {
- merge(r->l, l, r->l);
- t = r;
- }
- upd(t);
- }
- void split(tree *t, tree *&l, tree *&r, int val){
- upd(t);
- if(t == nullptr){
- l = nullptr;
- r = nullptr;
- return;
- }
- int tmp = getsz(t->l) + 1;
- if(tmp < val){
- split(t->r, t->r, r, val - tmp);
- l = t;
- }
- else{
- split(t->l, l, t->l, val);
- r = t;
- }
- upd(l);
- upd(r);
- }
- void get(tree *t, int tl, int tr, int type){
- tree *l, *r, *m;
- split(t, l, r, tr + 1);
- split(l, l, m, tl);
- if(type == 1)m->rev ^= 1;
- else cout<<m->ans<<endl;
- merge(l, l, m);
- merge(t, l, r);
- }
- int main(){
- int n, m;
- cin>>n>>m;
- int tmp;
- cin>>tmp;
- tree *root = new tree(tmp);
- for(int i = 1; i < n; i++){
- cin>>tmp;
- merge(root, root, new tree(tmp));
- }
- for(int i = 0; i < m; i++){
- int a, b, c;
- cin>>c>>a>>b;
- get(root, a, b, c);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement