马蜂清新FHQ,样例RE
查看原帖
马蜂清新FHQ,样例RE
379071
jjAAjj楼主2021/6/12 20:37

rt,真的要瞎了qq_emoji: kk

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
//#include<map>
#include<vector>
#include<math.h>
using namespace std;
//#define int long long
#define forr(i,a,b) for(int i=a;i<=b;i++)
#define repp(i,a,b) for(int i=a;i>=b;i--)
#define INF 1e9
#define ll long long
#define MAXN 200005
const int _x[]={0,1,0,-1,0},_y[]={0,0,1,0,-1};
#define mem(a,n) memset(a,n,sizeof(a));
#define chkmax(a,b) a=a>b?a:b;
#define chkmin(a,b) a=a<b?a:b;
#include<set>
#include<stack>
#define DE puts("check");
#define int long long
//int l,r,p;
struct FTree{
  int ch[2];
  int val,rad;
  int size;
};
FTree tree[MAXN];
int tot;
#define lc tree[i].ch[0]
#define rc tree[i].ch[1]
void update(int i){
  tree[i].size=tree[lc].size+tree[rc].size+1;
}
int addnode(int val){
  tree[++tot].size=1;
  tree[tot].val=val;
  tree[tot].rad=rand();
  return tot;
}
int merge(int l,int r){
  if(!l||!r){
    return l|r;
  }
  if(tree[l].rad<tree[r].rad){
 	  tree[l].ch[1]=merge(tree[l].ch[1],r);
 	  update(l);
  return l;
  }
  tree[r].ch[0]=merge(l,tree[r].ch[0]);
}
void split(int i,int k,int &l,int &r){
  if(!i){
 	  l=r=0;
 	  update(i);
 	  return;
  }
  if(tree[i].val<=k){
 	  l=i;
 	  split(tree[l].ch[1],k,tree[l].ch[1],r);
 	  update(i);
 	  return;
  }
  r=i;
  split(tree[r].ch[0],k,l,tree[r].ch[0]);
}
int findval(int i,int k){
  forr(i,0,INF){
 	  if(k<=tree[lc].size){
   	  i=lc;
    }
 	  else if(k==tree[lc].size+1){
   	  return i;
    }
 	  else{
   	  k-=tree[lc].size+1;
   	  i=rc;
    }
  }
}
int n,lowt;
int root,l,r,p;
int mon,ans;
//Tree tree;
signed main(){
  srand(1145141919810);
  scanf("%d%d",&n,&lowt);
  forr(i,1,n){
 	  char ch;
 	  int x;
 	  scanf("%s%d",&ch,&x);
 	  switch(ch){
   	  case 'I':{
     	  if(x<lowt){
      	  break;
        }
     	  x-=mon;
     	  split(root,x,l,r);
   	    root=merge(l,merge(addnode(x),r));
     	  break;
      }
   	  case 'A':{
     	  mon+=x;
     	  break;
      }
   	  case 'S':{
     	  mon-=x;
     	  split(root,lowt-mon-1,l,r);
     	  root=r;
     	  ans+=tree[l].size;
     	  break;
      }
   	  case 'F':{
     	  if(tree[root].size<x){
      	  puts("-1"); 
        }
     	  else{
       	  printf("%d\n",tree[findval(root,tree[root].size-x+1)].val+mon);
        }
     	  break;
      }
    }
  }
  printf("%d\n",ans);
}
2021/6/12 20:37
加载中...