Advertisement
Guest User

Untitled

a guest
Dec 16th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <set>
  4. using namespace std;
  5. set<int> k[131072];
  6. int treemax[262144], treemin[262144], treesize = 131072;
  7. int st[100001], nd[100001];
  8. void delet(int i) {
  9.     k[st[i]].erase(i);
  10.     int cur = treesize+st[i]-2;
  11.     if(k[st[i]].empty()){
  12.         treemax[cur]=-1;
  13.         treemin[cur]=-1;
  14.     }
  15.     else{
  16.         treemax[cur]=*(--k[st[i]].end());
  17.         treemin[cur]=*(k[st[i]].begin());
  18.     }
  19.     while(cur>0 && treemin[(cur-1)/2] == i){
  20.         cur--;
  21.         cur>>=1;
  22.         if(treemin[2*cur+1] == -1 && treemin[2*cur+2] == -1)
  23.             treemin[cur]=min(treemin[2*cur+1], treemin[2*cur+2]);
  24.         else if(treemin[2*cur+1] == -1)
  25.             treemin[cur]=treemin[2*cur+2];
  26.         else if(treemin[2*cur+2] == -1)
  27.             treemin[cur]=treemin[2*cur+1];
  28.         else
  29.             if(nd[treemin[2*cur+1]]<nd[treemin[2*cur+2]])
  30.                 treemin[cur] = treemin[2*cur+1];
  31.             else
  32.                 treemin[cur] = treemin[2*cur+2];
  33.     }
  34.  
  35.  
  36.     cur = treesize+st[i]-2;
  37.     while(cur>0 && treemax[(cur-1)/2] == i){
  38.         cur--;
  39.         cur>>=1;
  40.         if(treemax[2*cur+1] == -1 && treemax[2*cur+2] == -1)
  41.             treemax[cur]=max(treemax[2*cur+1], treemax[2*cur+2]);
  42.         else if(treemax[2*cur+1] == -1)
  43.             treemax[cur]=treemax[2*cur+2];
  44.         else if(treemax[2*cur+2] == -1)
  45.             treemax[cur]=treemax[2*cur+1];
  46.         else
  47.             if(nd[treemax[2*cur+1]]>nd[treemax[2*cur+2]])
  48.                 treemax[cur] = treemax[2*cur+1];
  49.             else
  50.                 treemax[cur] = treemax[2*cur+2];
  51.     }
  52. }
  53.  
  54. int check_in(int l, int r) {
  55.     if(nd[treemin[l]]<=r){
  56.         int wyn = treemin[l];
  57.         delet(treemin[l]);
  58.         return wyn;
  59.     }
  60.     return -1;
  61. }
  62. int check_over(int l, int r) {
  63.     if(nd[treemax[l]]>=r){
  64.         int wyn = treemax[l];
  65.         delet(treemax[l]);
  66.         return wyn;
  67.     }
  68.     return -1;
  69.  
  70. }
  71. int parser (string s, int a, int b) {
  72.     int l, r, wyn;
  73.     if(s == "in") {
  74.         l = treesize + a - 2;
  75.         r = treesize + b - 2;
  76.         wyn=check_in(l, b);
  77.         if(wyn!=-1)
  78.             return wyn;
  79.         wyn=check_in(r, b);
  80.         if(wyn!=-1)
  81.             return wyn;
  82.         while (l < r - 1) {
  83.             if (l%2 == 1){
  84.                 wyn=check_in(l+1, b);
  85.                 if(wyn!=-1)
  86.                     return wyn;
  87.             }
  88.             if (r%2 == 0){
  89.                 wyn=check_in(r-1, b);
  90.                 if(wyn!=-1)
  91.                     return wyn;
  92.             }
  93.             --l;l >>= 1;
  94.             --r;r >>= 1;
  95.         }
  96.         return -1;
  97.     }
  98.     else {
  99.         l = treesize - 1;
  100.         r = treesize + a - 2;
  101.         wyn=check_over(l, b);
  102.         if(wyn!=-1)
  103.             return wyn;
  104.         wyn=check_over(r, b);
  105.         if(wyn!=-1)
  106.             return wyn;
  107.         while (l < r - 1) {
  108.             if (l%2 == 1){
  109.                 wyn=check_over(l+1, b);
  110.                 if(wyn!=-1)
  111.                     return wyn;
  112.             }
  113.             if (r%2 == 0){
  114.                 wyn=check_over(r-1, b);
  115.                 if(wyn!=-1)
  116.                     return wyn;
  117.             }
  118.             --l;l >>= 1;
  119.             --r;r >>= 1;
  120.         }
  121.         return -1;
  122.     }
  123. }
  124.  
  125. int main(){
  126.     int n, a, b, q;
  127.     cin>>n;
  128.     for(int i = 1; i <= n; i++){
  129.         cin>>st[i]>>nd[i];
  130.         k[st[i]].insert(i);
  131.     }
  132.     for(int i = 0; i < 2*treesize; i++){
  133.         treemax[i]=-1;
  134.         treemin[i]=-1;
  135.     }
  136.     for(int i = 1; i <= n; i++){
  137.         int cur = treesize+st[i]-2;
  138.         treemax[cur]=nd[*(--k[st[i]].end())];
  139.         treemin[cur]=nd[*(k[st[i]].begin())];
  140.         while(cur>0){
  141.             cur--;
  142.             cur>>=1;
  143.             treemax[cur]=max(treemax[2*cur+1], treemax[2*cur+2]);
  144.             treemin[cur]=min(treemin[2*cur+1], treemin[2*cur+2]);
  145.         }
  146.     }
  147.     cin>>q;
  148.     string s;
  149.     for(int i = 0; i < q; i++){
  150.         cin>>s>>a>>b;
  151.         if(s[0] == 'i')
  152.             cout<<parser("in", a, b)<<" ";
  153.         if(s[0] == 'o')
  154.             cout<<parser("over", a, b)<<" ";
  155.         if(s[0] == 'n'){
  156.             int wyn=parser("in", 1, a-1);
  157.             if(wyn == -1)
  158.                 cout<<parser("in", b+1, treesize)<<" ";
  159.             else
  160.                 cout<<wyn<<" ";
  161.         }
  162.         if(s[0] == 's'){
  163.             int wyn=parser("in", a, b);
  164.             if(wyn == -1){
  165.                 wyn = parser("over", a, a);
  166.                 if(wyn == -1)
  167.                     cout<<parser("over", b, b)<<" ";
  168.                 else
  169.                     cout<<wyn<<" ";
  170.             }
  171.             else
  172.                 cout<<wyn<<" ";
  173.         }
  174.     }
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement