Дистанционная подготовка: Задача №111240. Переворот
Задача №111240. Переворот
от Владислав Дмитриев - Воскресенье 9 Февраль 2020, 13:24
111240. Переворот
  Помогите пожалуйста! Не понимаю своей ошибки
Вот код:
#include
using namespace std;
struct vertex{
vertex* left,* right;
int val, priority, size, minval;
bool rev;
vertex(int value){
val=minval=value;
priority=rand();
left=right=nullptr;
rev=false;
size=1;
}
};
int get_size(vertex* root){
if(root==nullptr){
return 0;
}
return root->size;
}
int get_min(vertex* root){
if(root==nullptr){
return 2e9;
}
return root->minval;
}
void update(vertex* &root){
if(root==nullptr){
return;
}
root->size=get_size(root->left)+get_size(root->right)+1;
root->minval=min(root->val,min(get_min(root->left),get_min(root->right)));
}
void push(vertex* &root){
if(root==nullptr)return;
root->rev=true;
}
void do_push(vertex*& v){
if(nullptr){
return;
}
if(v->rev){
v->rev=false;
swap(v->left,v->right);
push(v->left);
push(v->right);

}
}
pair split(vertex* root,int key){
if(root==nullptr){
return make_pair(nullptr,nullptr);
}
do_push(root);
if(get_size(root->left)+1right,key-get_size(root->left)-1);
root->right=splitten.first;
update(root);
return make_pair(root,splitten.second);
}else{
pair splitten=split(root->left,key);
root->left=splitten.second;
update(root);
return make_pair(splitten.first,root);
}
}
vertex* mergetreap(vertex*l,vertex*r){
if(l==nullptr||r==nullptr){
return l==nullptr?r:l;
}
do_push(l);
do_push(r);
if(l->priority>r->priority){
l->right=mergetreap(l->right,r);
update(l);
return l;
}else{
r->left=mergetreap(l,r->left);
update(r);
return r;
}
}
int getmin(vertex* &root,int l, int r){
pair splitten=split(root,r);
pair splitten2=split(splitten.first,l-1);
int answer=get_min(splitten2.second);
splitten.first=mergetreap(splitten2.first,splitten2.second);
root=mergetreap(splitten.first,splitten.second);
return answer;
}
void reversetreap(vertex* &root,int l,int r){
pair splitten=split(root,r);
pair splitten2=split(splitten.first,l-1);
splitten2.second->rev=true;
splitten.first=mergetreap(splitten2.first,splitten2.second);
root=mergetreap(splitten.first,splitten.second);
}
vertex* treap;
int main(){
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
//freopen("number.in","r",stdin);
//freopen("number.out","w",stdout);
int n, m, x, l, r, tip;
cin>>n>>m;
for(int i=0;i>x;
treap=mergetreap(treap,new vertex(x));
}
for(int i=0;i>tip>>l>>r;
if(tip==1){
reversetreap(treap,l,r);
}else{
cout