Submission #860463

#TimeUsernameProblemLanguageResultExecution timeMemory
860463ReLiceValley (BOI19_valley)C++14
0 / 100
61 ms5552 KiB
#include <bits/stdc++.h>
#define ll long long 
#define str string
#define ins insert
#define ld long double
#define pb push_back
#define pf push_front
#define pof pop_front()
#define pob pop_back()
#define lb lower_bound
#define ub upper_bound
#define endl "\n"
#define fr first
#define sc second
#define sz size()
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define bc back()
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<ll, null_type,less_equal<ll>, rb_tree_tag,tree_order_statistics_node_update>
void fre(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);}
void start(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}
const ll inf=1e18+7;
const ll mod=998244353;
const ll N=130*2;;
const ld eps=1e-9;
struct node{
	ll a,h,h2,hh;
	node* l;
	node* r;
};
node* newp(ll a){
	node* b=new node();
	b->a=a;
	b->h=b->h2=0ll;
	b->hh=1ll;
	b->l=b->r=NULL;
	return b;
}

node* next(node* v,ll a){
	if(v==NULL) return v;
	if(a>=v->a){
		return next(v->r,a);	
	}else{
		if(v->l==NULL) return v;
		node* x=next(v->l,a);
		if(x==NULL || x->a<=a) return v;
		return x;
	}
}
node* prev(node* v,ll a){
	if(v==NULL) return NULL;
	if(a>v->a){
		if(v->r==NULL) return v;
		node* x=prev(v->r,a);
		if(x==NULL || x->a>=a) return v;
		return x;
	}else{
		return	prev(v->l,a);
	}
}
bool check(node* v,ll a){
	if(v==NULL) return false;
	if(v->a==a) return true;
	if(a>v->a) return check(v->r,a);
	else return check(v->l,a);
}
node* bal(node* v){
	if(abs(v->h-v->h2)<2)return v;
	if(v->h2>v->h){
		node* b=v->r;
		if(b->h2>b->h){
			v->r=b->l;
			b->l=v;
			if(v->l!=NULL)v->h=v->l->hh;
			if(v->r!=NULL)v->h2=v->r->hh;
			v->hh=max(v->h,v->h2)+1;
			if(b->l!=NULL)b->h=b->l->hh;
			if(b->r!=NULL)b->h2=b->r->hh;
			b->hh=max(b->h,b->h2)+1;
			return b;
		}
		else{
			node* z=b->l;
			v->r=z->l;
			b->l=z->r;
			z->l=v;
			z->r=b;
			if(z->l!=NULL)z->h=z->l->hh;
			if(z->r!=NULL)z->h2=z->r->hh;
			z->hh=max(z->h,z->h2)+1;
			if(v->l!=NULL)v->h=v->l->hh;
			if(v->r!=NULL)v->h2=v->r->hh;
			v->hh=max(v->h,v->h2)+1;
			if(b->l!=NULL)b->h=b->l->hh;
			if(b->r!=NULL)b->h2=b->r->hh;
			b->hh=max(b->h,b->h2)+1;
			return z;
		}
		
	}else{
		node* b=v->l;
		if(b->h>b->h2){
			v->l=b->r;
			b->r=v;
			if(v->l!=NULL)v->h=v->l->hh;
			if(v->r!=NULL)v->h2=v->r->hh;
			v->hh=max(v->h,v->h2)+1;
			if(b->l!=NULL)b->h=b->l->hh;
			if(b->r!=NULL)b->h2=b->r->hh;
			b->hh=max(b->h,b->h2)+1;
			return b;
		}
		else{
			node* z=b->r;
			v->l=z->r;
			b->r=z->l;
			z->r=v;
			z->l=b;
			if(z->l!=NULL)z->h=z->l->hh;
			if(z->r!=NULL)z->h2=z->r->hh;
			z->hh=max(z->h,z->h2)+1;
			if(v->l!=NULL)v->h=v->l->hh;
			if(v->r!=NULL)v->h2=v->r->hh;
			v->hh=max(v->h,v->h2)+1;
			if(b->l!=NULL)b->h=b->l->hh;
			if(b->r!=NULL)b->h2=b->r->hh;
			b->hh=max(b->h,b->h2)+1;
			return z;
		}
	}
}
node* ins(node* v,ll a){
	if(v==NULL){
		return newp(a);
	}
	if(a==v->a) return v;
	else if(a>v->a){
		v->r=ins(v->r,a);
		if(v->r!=NULL)v->h2=v->r->hh;
	}else{
		v->l=ins(v->l,a);
		if(v->l!=NULL)v->h=v->l->hh;
	}
	v->hh=max(v->h,v->h2)+1ll;
	
	v=bal(v);
	return v;
}
node* mx(node* v){
	if(v->r==NULL){
		return v;
	}else {
		node* b=mx(v->r);
		if(b==v->r) v->r=b->l;
		if(v->r!=NULL) v->h2=v->r->hh;
		v->hh=max(v->h,v->h2)+1ll;
		v=bal(v);
		return b;
	}
}
node* del(node* v,ll a){
	if(v==NULL){
		return v;
	}
	if(a==v->a) {
		if(v->l==NULL && v->r==NULL)return NULL;
		if(v->l==NULL) return v->r;
		if(v->r==NULL) return v->l;
		node* b=mx(v->l);
		if(v->l!=b && b!=NULL)b->l=v->l;
		if(b!=NULL)b->r=v->r;
		if(b!=NULL)b=bal(b);
		
		return b;
	}
	else if(a>v->a){
		v->r=del(v->r,a);
		if(v->r!=NULL)v->h2=v->r->hh;
	}else{
		v->l=del(v->l,a);
		if(v->l!=NULL)v->h=v->l->hh;
	}
	v->hh=max(v->h,v->h2)+1;
	v=bal(v);
	return v;
}
void solve(){
    ll b;
    node* r=NULL;
    str s;
    while(cin>>s){
		cin>>b;
		if(s=="insert"){
			r=ins(r,b);
		}else if(s=="delete"){
			r=del(r,b);
		}else if(s=="exists"){
			if(check(r,b))cout<<"true"<<endl;
			else cout<<"false"<<endl;
		}else if(s=="next"){
			if(next(r,b)==NULL)cout<<"none"<<endl;
			else cout<<next(r,b)->a<<endl;
			
		}else{
			if(prev(r,b)==NULL)cout<<"none"<<endl;
			else cout<<prev(r,b)->a<<endl;
		}
	}
}

signed main(){
    start();
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    ll t=1;
    //cin>>t;
    while(t--) solve();
}
/*
insert 1
insert 2
insert 3
insert 4
insert 5
insert 6
insert 7
insert 8
 
 
 
*/

Compilation message (stderr)

valley.cpp: In function 'void fre(std::string)':
valley.cpp:24:27: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 | void fre(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);}
      |                    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
valley.cpp:24:64: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 | void fre(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);}
      |                                                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...