1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); 2 #include <cstdio>//sprintf islower isupper 3 #include <cstdlib>//malloc exit strcat itoa system("cls") 4 #include <iostream>//pair 5 #include <fstream>//freopen("C:\\Users\\13606\\Desktop\\Input.txt","r",stdin); 6 #include <bitset> 7 //#include <map> 8 //#include<unordered_map> 9 #include <vector> 10 #include <stack> 11 #include <set> 12 #include <string.h>//strstr substr strcat 13 #include <string> 14 #include <time.h>// srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9; 15 #include <cmath> 16 #include <deque> 17 #include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less 18 #include <vector>//emplace_back 19 //#include <math.h> 20 #include <cassert> 21 #include <iomanip> 22 //#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor 23 #include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare) 24 using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation 25 //****************** 26 clock_t __START,__END; 27 double __TOTALTIME; 28 void _MS(){__START=clock();} 29 void _ME(){__END=clock();__TOTALTIME=(double)(__END-__START)/CLOCKS_PER_SEC;cout<<"Time: "<<__TOTALTIME<<" s"<<endl;} 30 //*********************** 31 #define rint register int 32 #define fo(a,b,c) for(rint a=b;a<=c;++a) 33 #define fr(a,b,c) for(rint a=b;a>=c;--a) 34 #define mem(a,b) memset(a,b,sizeof(a)) 35 #define pr printf 36 #define sc scanf 37 #define ls rt<<1 38 #define rs rt<<1|1 39 typedef pair<int,int> PII; 40 typedef vector<int> VI; 41 typedef long long ll; 42 const double E=2.718281828; 43 const double PI=acos(-1.0);// 44 const ll INF=(1LL<<60); 45 const int inf=(1<<30); 46 const double ESP=1e-9; 47 const int mod=(int)1e9+7; 48 const int N=(int)4e6+10; 49 50 int ans[N],a[N]; 51 int c[N],maxn; 52 int lowbit(int n){return n&(-n);} 53 void add(int i,int t) 54 { 55 while(i<=maxn) 56 { 57 c[i]+=t; 58 i+=lowbit(i); 59 } 60 } 61 int Sum(int i) 62 { 63 int sum=0; 64 while(i) 65 { 66 sum+=c[i]; 67 i-=lowbit(i); 68 } 69 return sum; 70 } 71 struct node 72 { 73 int l,r,k,id,currk,op; 74 }q[N],temp[N]; 75 void Init() 76 { 77 for(int i=0;i<=N-3;++i) 78 c[i]=0; 79 } 80 81 void solve(int l,int r,int ql,int qr) 82 { 83 if(ql>qr)return; 84 int L=ql,R=qr,mid=l+r>>1; 85 86 if(l==r) 87 { 88 for(int i=ql;i<=qr;++i) 89 if(q[i].op==3) 90 ans[q[i].id]=l;//答案 91 return; 92 } 93 for(int i=ql;i<=qr;++i) 94 { 95 if(q[i].op!=3)temp[q[i].r<=mid?L++:R--]=q[i];//分位置 96 97 if(q[i].op==1&&q[i].r<=mid)add(q[i].l,1);//q.l才是要加的位置,q.r是值 98 else if(q[i].op==2&&q[i].r<=mid)add(q[i].l,-1); 99 else if(q[i].op==3) 100 { 101 int sum=Sum(q[i].r)-Sum(q[i].l-1);//二分是保证按时间顺序来的,直接计算就行 102 if(q[i].currk+sum>=q[i].k)temp[L++]=q[i];//分位置 103 else q[i].currk+=sum,temp[R--]=q[i]; 104 } 105 } 106 for(int i=ql;i<=qr;++i)//清空-树状数组 107 { 108 if(q[i].op==1&&q[i].r<=mid)add(q[i].l,-1); 109 else if(q[i].op==2&&q[i].r<=mid)add(q[i].l,1); 110 } 111 //还原 112 for(int i=ql;i<=L-1;++i) 113 q[i]=temp[i]; 114 for(int i=qr,j=L;j<=qr;--i,++j) 115 q[j]=temp[i]; 116 117 //递归下去 118 if(L>ql)solve(l,mid,ql,L-1); 119 if(R<qr)solve(mid+1,r,R+1,qr); 120 } 121 122 int main() 123 { 124 int n,m; 125 while(~sc("%d",&n)) 126 { 127 // Init(); 128 maxn=n; 129 for(int i=1;i<=n;++i) 130 sc("%d",&q[i].r),q[i].l=i,a[i]=q[i].r,q[i].op=1; 131 sc("%d",&m); 132 int ask=0; 133 for(int i=1;i<=m;++i) 134 { 135 int J; 136 sc("%d",&J); 137 if(J==1) 138 { 139 int pos,x; 140 sc("%d%d",&pos,&x); 141 ++n; 142 q[n].l=pos,q[n].r=a[pos],q[n].op=2;//del 143 ++n,a[pos]=x; 144 q[n].l=pos,q[n].r=a[pos],q[n].op=1;//add 145 } 146 else 147 ++n,sc("%d%d%d",&q[n].l,&q[n].r,&q[n].k),q[n].currk=0,q[n].id=++ask,q[n].op=3;//query 148 } 149 solve(0,inf,1,n); 150 for(int i=1;i<=ask;++i) 151 pr("%d\n",ans[i]); 152 } 153 return 0; 154 } 155 156 /**************************************************************************************/
原文:https://www.cnblogs.com/--HPY-7m/p/11913861.html