首页 > 代码库 > sdut 迷之容器

sdut 迷之容器

#include <iostream>#include <algorithm>#include <string.h>#include <stdio.h>#define N 100010using namespace std;int n,tt,le;char a[N][3];int m[N],X[N];struct node{    int l,r,w;} q[4*N];void pushup(int rt){    q[rt].w=q[rt<<1].w+q[rt<<1|1].w;}void build(int l,int r,int rt){    q[rt].l=l;    q[rt].r=r;    q[rt].w=0;    if(l==r) return ;    int mid=(l+r)>>1;    build(l,mid,rt<<1);    build(mid+1,r,rt<<1|1);}void update(int l,int r,int rt,int key){    if(l==r&&r==key)    {        q[rt].w=1;        return ;    }    int mid=(l+r)>>1;    if(key<=mid) update(l,mid,rt<<1,key);    else update(mid+1,r,rt<<1|1,key);    pushup(rt);    return ;}int query(int l,int r,int rt,int key){    if(l==r)    {        return l;    }    int mid=(l+r)>>1;    if(key<=q[rt<<1].w) return query(l,mid,rt<<1,key);    else return query(mid+1,r,rt<<1|1,key-q[rt<<1].w);}int main(){    while(scanf("%d",&n)!=EOF)    {        tt=0;        for(int i=0; i<n; i++)        {            scanf("%s%d",a[i],&m[i]);            if(a[i][0]==P)            {                X[tt++]=m[i];            }        }        sort(X,X+tt);        int sum=unique(X,X+tt)-X;        build(1,sum,1);        for(int i=0; i<n; i++)        {            if(a[i][0]==P)            {                le=lower_bound(X,X+sum,m[i])-X+1;                update(1,sum,1,le);            }            else if(a[i][0]==Q)            {                if(q[1].w<m[i])                {                    printf("-1\n");                }                else                {                    int tt=query(1,sum,1,m[i]);                    printf("%d\n",X[tt-1]);                }            }        }    }    return 0;}

 

sdut 迷之容器