• <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++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              21 隨筆 :: 0 文章 :: 17 評(píng)論 :: 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之間的第一個(gè)比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 閱讀(192) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            一本久久久久久久| 久久综合精品国产二区无码| 精品久久久久久无码专区不卡| 色综合久久久久无码专区| 综合久久国产九一剧情麻豆 | 国产精品一区二区久久精品涩爱| 久久久久人妻一区精品| 久久久午夜精品| 久久精品男人影院| 亚洲午夜精品久久久久久app| 久久66热人妻偷产精品9| 久久久久久无码国产精品中文字幕 | 久久免费线看线看| 亚洲综合久久久| 国产午夜久久影院| 亚洲人成网站999久久久综合| 国产精品青草久久久久婷婷| 亚洲国产成人久久综合野外| 97r久久精品国产99国产精| 欧美一区二区久久精品| 大蕉久久伊人中文字幕| 久久精品国产第一区二区三区| 亚洲成av人片不卡无码久久| 久久午夜电影网| 99久久99这里只有免费费精品| 久久精品无码一区二区三区免费| 国产成年无码久久久久毛片| 亚洲精品蜜桃久久久久久| 久久人人爽人人人人片av| 久久婷婷五月综合色99啪ak| 国产精品一区二区久久精品无码| 2022年国产精品久久久久| 日韩人妻无码精品久久久不卡| 一级a性色生活片久久无| 人妻无码久久精品| 久久久久久亚洲精品不卡| 久久av高潮av无码av喷吹| 国产亚洲精午夜久久久久久| 777久久精品一区二区三区无码 | 久久黄视频| 亚洲精品WWW久久久久久|