Submission #313607

#TimeUsernameProblemLanguageResultExecution timeMemory
313607gurkotInterval Collection (CCO20_day2problem2)C++14
25 / 25
3963 ms245100 KiB
#include <iostream>
#include <set>
using namespace std;

multiset <int> setl,setr;
multiset <int> msl[1000001],msr[1000001];
struct Node { int maxl,minr,ans;} tree[4000001];
const int TS=1000000; 
int q,a,b;
char ch;
    
void update_L(int u,int a,int b,int pos,int val) {
 //cout<<a<<"   -L-   "<<b<<" u="<<u<<endl;
 if(a==b) {
  tree[u].maxl=val; tree[u].ans=tree[u].minr-val; 
  //cout<<"tree_L: ans="<<tree[u].ans<<endl;
  //cout<<a<<"   -L-   "<<b<<" u="<<u<<endl;
  return;
 } 
 int c=(a+b)/2;
 int l,r;
 l=2*u; r=l+1;
 if(pos<=c) update_L(l,a,c,pos,val);
       else update_L(r, c+1,b,pos,val);
 
 tree[u].maxl=max(tree[l].maxl,tree[r].maxl);
 tree[u].minr=min(tree[l].minr,tree[r].minr);      
 tree[u].ans=min(tree[l].ans,tree[r].ans);
 tree[u].ans=min(tree[u].ans,tree[r].minr-tree[l].maxl);       
}


void update_R(int u,int a,int b,int pos,int val) {
 //cout<<a<<"   -R-   "<<b<<" u="<<u<<endl;
 if(a==b) {
  tree[u].minr=val;	tree[u].ans=val-tree[u].maxl;  
  //cout<<"tree_R: ans="<<tree[u].ans<<endl;
  //cout<<a<<"   -R-   "<<b<<" u="<<u<<endl;
  return;
 } 
 int c=(a+b)/2;
 int l,r;
 l=2*u; r=l+1;
 if(pos<=c) {
  update_R(l,a,  c,pos,val);
  tree[u].maxl=max(tree[l].maxl,tree[r].maxl);
  tree[u].minr=min(tree[l].minr,tree[r].minr);
  
 } else {
  update_R(r,c+1,b,pos,val);
  tree[u].maxl=max(tree[l].maxl,tree[r].maxl);
  tree[u].minr=min(tree[l].minr,tree[r].minr);  
 }
  
  
      
 tree[u].ans=min(tree[l].ans,tree[r].ans);
 tree[u].ans=min(tree[u].ans,tree[r].minr-tree[l].maxl);       
}

main(){ 
 for (int i=1;i<=4000000;i++){ 
   tree[i].maxl=-10000000, tree[i].minr=10000000;
   tree[i].ans=2000001;
 }
   
 ios::sync_with_stdio(false);
 cin>>q;
 while(q--) {
  cin>>ch>>a>>b;
  if(ch=='A') {
   setl.insert(a); setr.insert(b);
   msl[b].insert(a); msr[a].insert(b); 
   
   //cout<<*msl[b].rbegin()<<"  - ok1- "<<*msr[a].begin()<<endl;   
   //system("pause");
                
   
   update_R(1,1,TS,a,*msr[a].begin());
   update_L(1,1,TS,b,*msl[b].rbegin());
   
   
  } else { 
   setl.erase(setl.find(a));        setr.erase(setr.find(b));
   msl[b].erase(msl[b].find(a));    msr[a].erase(msr[a].find(b));
   
   
     
   if (msr[a].size()==0) update_R(1,1,TS,a,10000000);
                   else  update_R(1,1,TS,a,*msr[a].begin());
                   
   if (msl[b].size()==0) update_L(1,1,TS,b,-10000000);
                   else  update_L(1,1,TS,b,*msl[b].rbegin());
   
  }
  
  a=*setl.rbegin();  b=*setr.begin(); 
   //cout<<"a="<<a<<" <- ok4 -> "<<"b="<<b<<endl;
   
  /* 
   cout<<"tree\n";
   for (int i=1;i<10;i++) 
    cout<<"node "<<i<<":    "<<
	  tree[i].maxl<<" "<<tree[i].minr<<"  ans="<<tree[i].ans<<endl;
   system("pause");
  */
           
  if(a<b)   cout<<(*msr[a].begin()-*msl[b].rbegin())<<endl;
     else   cout<<tree[1].ans<<endl;  
 }//while
}

Compilation message (stderr)

Main.cpp:61:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   61 | main(){
      |      ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...