Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define REP(i , j) for(int i = 0 ; i < j ; i ++)
- #define REPNM(i , j , k) for(int i = j ; i < k ; i ++)
- #define ALL(i) i.begin() , i.end()
- #define RI(i) scanf("%d" , &i)
- #define RII(i , j) scanf("%d%d" , &i , &j)
- #define DBGG(i , j) cout << i << " " << j << endl;
- #define pb push_back
- #define MAX 100090
- class Q{
- public:
- int ty , l , r , k; /// or [ at , k , +- 1]
- };
- Q q[MAX * 3];
- int n , m , ans[MAX * 3] , bit[MAX * 3];
- int query(int now){
- int tmp = 0;
- for(int i = now ; i > 0 ; i -= (i & -i)) tmp += bit[i];
- return tmp;
- }
- void update(int k , int v){
- for(int i = k ; i < MAX * 3 ; i += (i & -i)) bit[i] += v;
- }
- void Solve(int l , int r , vector<int> sol){
- vector<int> lthing , rthing;
- int mid = (l + r) / 2;
- if(l == r){
- for(auto i : sol) if(q[i].ty)ans[i] = l;
- return ;
- }
- for(auto i : sol){
- if(q[i].ty == 0){
- if(q[i].r <= mid) update(q[i].l , q[i].k) , lthing.pb(i);
- else rthing.pb(i);
- }
- else {
- int tmp = query(q[i].r) - query(q[i].l - 1);
- // DBGG(l , r);
- // cout << "mid = " << mid << "\ttmp = " << tmp << endl;
- if(tmp >= q[i].k) lthing.pb(i);
- else rthing.pb(i) , q[i].k -= tmp;
- }
- }
- for(auto i : lthing)
- if(q[i].ty == 0) update(q[i].l , -q[i].k);
- Solve(l , mid , lthing);
- Solve(mid + 1 , r , rthing);
- }
- int po , x[MAX];
- void ADDQ(int typ , int a , int b , int c){ // ty == 0 modify : ty == 1 query
- q[po].ty = typ;
- q[po].l = a;
- q[po].r = b;
- q[po].k = c;
- po++;
- }
- // [ at , k , +- 1]
- vector<int> uni;
- int main(){
- RII(n , m);
- int tmp , tma , tmb;
- char qc;
- REPNM(i , 1 , n + 1)
- RI(x[i]) , uni.pb(x[i]) , ADDQ(0 , i , x[i] , 1);
- REP(i , m){
- getchar();
- scanf("%c" , &qc);
- if(qc == 'Q'){
- scanf("%d%d%d" , &tmp , &tma , &tmb);
- ADDQ(1 , tmp , tma , tmb);
- }
- else {
- scanf("%d%d" , &tmp , &tma);
- ADDQ(0 , tmp , x[tmp] , -1);
- ADDQ(0 , tmp , tma , 1);
- x[tmp] = tma;
- uni.pb(tma);
- }
- }
- // DBGG("po = " , po);
- sort(ALL(uni));
- uni.resize(unique(ALL(uni)) - uni.begin());
- REP(i , po)
- if(q[i].ty == 0)
- q[i].r = lower_bound(ALL(uni) , q[i].r) - uni.begin();
- vector<int> sol;
- REP(i , po) sol.pb(i);
- Solve(0 , uni.size() , sol);
- REP(i , po)
- if(q[i].ty)printf("%d\n" , uni[ans[i]]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement