abc G求调
  • 板块学术版
  • 楼主寄风孤影
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/2/24 21:41
  • 上次更新2024/2/25 09:42:43
查看原帖
abc G求调
756684
寄风孤影楼主2024/2/24 21:41

RT,分块T了一半

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i , l , r) for(int i = l;i <= r;i++)
#define per(i , l , r) for(int i = r;i >= l;i--)
inline int read(){
	int s = 0 , xi = 1;
	char op = getchar();
	while(op < '0' || op > '9'){
		if(op == '-') xi = -1;
		op = getchar();
	}
	while(op >= '0' && op <= '9'){
		s = (s << 1) + (s << 3) + op - '0';
		op = getchar();
	}
	return s * xi;
}
inline void print(int x){
	if(x < 0) putchar('-') , x *= -1;
	if(x < 10){
		putchar(x + '0');
		return;
	}
	print(x / 10);
	putchar(x % 10 + '0');
}
set <int> d[1000005] , bk[1000005];
int op[1000005] , l[1000005] , r[10000005] , x[10000005];
int ll[1000005] , rr[1000005] , bel[1000005] , a[1000005] , len , cnt;
signed main(){
    // ios::sync_with_stdio(0);
    // cin.tie(0),cout.tie(0); 
    int n = read();
    rep(i , 1 , n) a[i] = read() , d[i].insert(a[i]);
	len = sqrt(n);
	cnt = n / len + (bool) (n % len);
	for(int i = 1 , j = 1;i <= n;i += len , j++){
		rr[j - 1] = i - 1;
		ll[j] = i;
		for(int k = ll[j - 1];k <= rr[j - 1];k++) bel[k] = j - 1;
	}
    // cout << ll[1] << ' ' << rr[1] << endl;
	rr[cnt] = n;
	for(int i = ll[cnt];i <= rr[cnt];i++) bel[i] = cnt;
    // for(int i = 1;i <= n;i++) cout << bel[i] << ' ';
    // cout << endl;
    int q = read();
    rep(ii , 1 , q){
        op[ii] = read();
        if(op[ii] == 3){
            int id = read();
            int tmp = 0;
            if(bk[bel[id]].size()) tmp = (*(bk[bel[id]].rbegin()));
            // cout << tmp << ' ';
            print(max(tmp , (*(d[id].rbegin()))));
            putchar('\n');
            // cerr << bel[id] << '\n';
        }
        if(op[ii] == 1){
            l[ii] = read() , r[ii] = read() , x[ii] = read();
            int s = l[ii] , t = r[ii];
            for(int i = 1;i <= cnt;i++){
                if(rr[i] < s || ll[i] > t) continue;
                if(ll[i] >= s && rr[i] <= t){
                    // cout << i << ' ';
                    bk[i].insert(x[ii]);
                    continue;
                }
                for(int j = max(s , ll[i]);j <= min(t , rr[i]);j++){
                    d[j].insert(x[ii]);
                }
            }
            // cout << "end\n";
        }
        if(op[ii] == 2){
            int id = read();
            int s = l[id] , t = r[id];
            for(int i = 1;i <= cnt;i++){
                if(rr[i] < s || ll[i] > t) continue;
                if(ll[i] >= s && rr[i] <= t){
                    auto it = bk[i].lower_bound(x[id]);
                    if((*it) == x[id]) bk[i].erase(it);
                    continue;
                }
                for(int j = max(s , ll[i]);j <= min(t , rr[i]);j++){
                    auto it = d[j].lower_bound(x[id]);
                    if((*it) == x[id]) d[j].erase(it);
                }
            }
        }
    }
    return 0;
}   
2024/2/24 21:41
加载中...