• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            a tutorial on computer science

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              21 隨筆 :: 0 文章 :: 17 評論 :: 0 Trackbacks
            #include <cstdio>
            #include <vector>
            #include <algorithm>
            #include <cstring>
            const int maxn =  210000+20;
            const int INF = 1<<29;
            using namespace std;
            int N;
            struct Node
            {
              char op[6];
              int x,y,pos;
            };
            vector<Node> hh;
            int rmost[maxn*8],cnt[maxn*8],hpos[maxn*8];
            bool operator< (const Node& a,const Node& b)
            {
              if(a.x != b.x) return a.x < b.x;
              return a.y < b.y;
            }
            bool operator== (const Node& a,const Node& b)
            {
              if(a.x == b.x&&a.y==b.y) return true;
              return false;
            }
            void add(int pos,int ll,int rr,int idx)
            {
               if(ll == rr)
               {
                 rmost[idx] = hh[pos].y;
                 cnt[idx]++;
                 hpos[idx] = pos;
                 return; 
               }
               int mid = (ll+rr)/2;
               if(pos <= mid)
                 add(pos,ll,mid,idx*2);
               else
                 add(pos,mid+1,rr,idx*2+1);
             
               cnt[idx] = cnt[idx*2] + cnt[idx*2+1];
               rmost[idx] = max(rmost[idx*2],rmost[idx*2+1]);
            }
            void del(int pos,int ll,int rr,int idx)
            {
              if(ll == rr)
              {
                cnt[idx]--;
                if(cnt[idx] == 0)
                  rmost[idx] = -1;
                return;
              }
               int mid = (ll+rr)/2;
               if(pos <= mid)
                 del(pos,ll,mid,idx*2);
               else
                 del(pos,mid+1,rr,idx*2+1);
              
              cnt[idx]--;
              rmost[idx] = max(rmost[idx*2],rmost[idx*2+1]);
            }
            int query(int l,int ll,int rr,int y,int idx)//l和r之間的第一個比y大的
            {
              if(ll == rr)
              {
                if(cnt[idx] > 0 && rmost[idx] > y)
                  return hpos[idx];
                return -1; 
              }  
             int mid = (ll+rr)/2;
             int nret = -1;
             if(l<=mid && rmost[idx*2] > y) nret = query(l,ll,mid,y,idx*2);
             if(nret == -1 && rmost[idx*2+1] > y) nret = query(l,mid+1,rr,y,idx*2+1);
             return nret;
            }
            int main()
            {
               int i,j;
               int casenum = 1;
               while(scanf("%d",&N)!=EOF && N)
              {
              hh.clear();
                if(casenum != 1) printf("\n");
                printf("Case %d:\n",casenum++);
                hh.clear();
                memset(cnt,0,sizeof(cnt));
                memset(rmost,0,sizeof(rmost));
                vector<Node> vec;
                Node tmp;
                for(i=0;i<N;i++)
                {
                  scanf("%s%d%d",tmp.op,&tmp.x,&tmp.y);
                  vec.push_back(tmp);
                  hh.push_back(tmp);
                }
                sort(hh.begin(),hh.end());
                hh.erase(unique(hh.begin(),hh.end()),hh.end());
                for(i=0;i<N;i++)
                {
                  vec[i].pos = lower_bound(hh.begin(),hh.end(),vec[i]) - hh.begin();
                }
               for(i=0;i<N;i++)
               {
                 if(vec[i].op[0] == 'a')
               add(vec[i].pos,0,hh.size()-1,1);
                 else if(vec[i].op[0] == 'r') 
               del(vec[i].pos,0,hh.size()-1,1);
                 else
                 {
                  for(j=vec[i].pos;j<hh.size();j++)
                    if(hh[j].x > vec[i].x)
                      break;
                   if(j == hh.size()) 
                   {
                    printf("-1\n");
                    continue;
                   }
                   int num = query(j,0,hh.size()-1,vec[i].y,1);
                   if(num == -1) printf("-1\n");
                   else
                      printf("%d %d\n",hh[num].x,hh[num].y);
                 }
               }
              }
              return 0;
            }
            posted on 2012-07-26 12:14 bigrabbit 閱讀(190) 評論(0)  編輯 收藏 引用
            久久国产精品二国产精品| 国内精品久久久久影院优 | 久久国产成人午夜AV影院| 久久男人AV资源网站| 久久精品视频一| 国产精品久久国产精品99盘| 久久成人18免费网站| 久久亚洲精品无码AV红樱桃| 大美女久久久久久j久久| 人妻精品久久无码区| 色综合合久久天天给综看| 国产精品久久久久AV福利动漫| 久久中文字幕视频、最近更新| 国产午夜精品久久久久免费视| 狠狠色综合久久久久尤物| 精品久久久久久中文字幕人妻最新| 精品久久人人爽天天玩人人妻| 久久精品水蜜桃av综合天堂| 久久精品亚洲欧美日韩久久| 久久久久久毛片免费播放| 久久精品免费一区二区| 国产毛片久久久久久国产毛片 | 精品综合久久久久久98| 久久精品一区二区三区中文字幕 | 麻豆精品久久精品色综合| 久久精品国产2020| 久久人妻少妇嫩草AV蜜桃| 久久久久亚洲AV无码专区网站| 久久成人影院精品777| 久久精品国产亚洲av麻豆色欲| 伊人久久大香线蕉综合5g| 日韩欧美亚洲国产精品字幕久久久| 亚洲国产成人久久精品影视| 久久综合噜噜激激的五月天| 无码八A片人妻少妇久久| 蜜桃麻豆WWW久久囤产精品| 国产香蕉久久精品综合网| 久久91精品国产91| 熟妇人妻久久中文字幕| 久久亚洲国产成人精品性色| av无码久久久久久不卡网站|