結果

問題 No.2901 Logical Sum of Substring
ユーザー 👑 binapbinap
提出日時 2024-09-21 06:56:53
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 412 ms / 3,000 ms
コード長 4,271 bytes
コンパイル時間 4,542 ms
コンパイル使用メモリ 277,008 KB
実行使用メモリ 89,700 KB
最終ジャッジ日時 2024-09-21 06:57:09
合計ジャッジ時間 14,935 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 AC 5 ms
5,376 KB
testcase_03 AC 5 ms
5,376 KB
testcase_04 AC 5 ms
5,376 KB
testcase_05 AC 5 ms
5,376 KB
testcase_06 AC 5 ms
5,376 KB
testcase_07 AC 6 ms
5,376 KB
testcase_08 AC 332 ms
89,700 KB
testcase_09 AC 320 ms
89,696 KB
testcase_10 AC 324 ms
89,696 KB
testcase_11 AC 341 ms
89,700 KB
testcase_12 AC 339 ms
89,696 KB
testcase_13 AC 338 ms
89,696 KB
testcase_14 AC 391 ms
89,692 KB
testcase_15 AC 412 ms
89,612 KB
testcase_16 AC 382 ms
89,696 KB
testcase_17 AC 333 ms
89,436 KB
testcase_18 AC 334 ms
89,568 KB
testcase_19 AC 358 ms
89,484 KB
testcase_20 AC 339 ms
89,696 KB
testcase_21 AC 347 ms
89,568 KB
testcase_22 AC 338 ms
89,488 KB
testcase_23 AC 341 ms
89,564 KB
testcase_24 AC 319 ms
89,568 KB
testcase_25 AC 321 ms
89,568 KB
testcase_26 AC 322 ms
86,752 KB
testcase_27 AC 331 ms
86,876 KB
testcase_28 AC 310 ms
86,880 KB
testcase_29 AC 311 ms
88,288 KB
testcase_30 AC 332 ms
88,288 KB
testcase_31 AC 317 ms
88,288 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
#include<atcoder/all>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
using namespace atcoder;
typedef long long ll;
typedef vector<int> vi;
typedef vector<long long> vl;
typedef vector<vector<int>> vvi;
typedef vector<vector<long long>> vvl;
typedef long double ld;
typedef pair<int, int> P;

ostream& operator<<(ostream& os, const modint& a) {os << a.val(); return os;}
template <int m> ostream& operator<<(ostream& os, const static_modint<m>& a) {os << a.val(); return os;}
template <int m> ostream& operator<<(ostream& os, const dynamic_modint<m>& a) {os << a.val(); return os;}
template<typename T> istream& operator>>(istream& is, vector<T>& v){int n = v.size(); assert(n > 0); rep(i, n) is >> v[i]; return is;}
template<typename U, typename T> ostream& operator<<(ostream& os, const pair<U, T>& p){os << '('<< p.first << ',' << p.second << ')'; return os;}
template<typename T> ostream& operator<<(ostream& os, const vector<T>& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : " "); return os;}
template<typename T> ostream& operator<<(ostream& os, const vector<vector<T>>& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : ""); return os;}
template<typename T> ostream& operator<<(ostream& os, const set<T>& se){for(T x : se) os << x << " "; os << "\n"; return os;}
template<typename T> ostream& operator<<(ostream& os, const unordered_set<T>& se){for(T x : se) os << x << " "; os << "\n"; return os;}
template<typename S, auto op, auto e> ostream& operator<<(ostream& os, const atcoder::segtree<S, op, e>& seg){int n = seg.max_right(0, [](S){return true;}); rep(i, n) os << seg.get(i) << (i == n - 1 ? "\n" : " "); return os;}
template<typename S, auto op, auto e, typename F, auto mapping, auto composition, auto id> ostream& operator<<(ostream& os, const atcoder::lazy_segtree<S, op, e, F, mapping, composition, id>& seg){int n = seg.max_right(0, [](S){return true;}); rep(i, n) os << seg.get(i) << (i == n - 1 ? "\n" : " "); return os;}

template<typename T> void chmin(T& a, T b){a = min(a, b);}
template<typename T> void chmax(T& a, T b){a = max(a, b);}

int MAX;
const int INF = 1001001001;

struct S{
	vector<pair<int, int>> left, right;
	int ans;
	int len;
	S(int x = -1){
		ans = INF;
		len = 0;
		if(x == -1){
			
		}else{
			left = {{x, 1}};
			right = {{x, 1}};
			len++;
			if(x == MAX) ans = 1;
		}
	}
	int all(){
		if(len == 0) return 0;
		return (left.back()).first;
	}
};


S e(){
	S res;
	return res;
};

S op(S a, S b){
	if(a.len == 0) return b;
	if(b.len == 0) return a;
	
	S res;
	res.left = a.left;
	res.right = b.right;
	res.len = a.len + b.len;
	res.ans = min(a.ans, b.ans);
	
	{
		int m = b.left.size();
		int before = a.all();
		int len = a.len;
		rep(i, m){
			auto [val, time] = b.left[i];
			int prod = a.all() | val;
			if(prod == MAX) chmin(res.ans, len + 1);
			if(before == prod){
				res.left.back().second += time;
			}else{
				res.left.emplace_back(prod, time);
			}
			len += time;
			before = prod;
		}
	}
	{
		int m = a.right.size();
		int before = b.all();
		int len = b.len;
		rep(i, m){
			auto [val, time] = a.right[i];
			int prod = val | b.all();
			if(prod == MAX) chmin(res.ans, len + 1);
			if(before == prod){
				res.right.back().second += time;
			}else{
				res.right.emplace_back(prod, time);
			}
			len += time;
			before = prod;
		}
	}
	{
		int ma = a.right.size();
		int mb = b.left.size();
		int lena = 0;
		rep(ia, ma){
			int lenb = 0;
			auto [vala, timea] = a.right[ia];
			rep(ib, mb){
				auto [valb, timeb] = b.left[ib];
				int prod = (vala | valb);
				if(prod == MAX) chmin(res.ans, lena + lenb + 2);
				lenb += timeb;
			}
			lena += timea;
		}
	}
	
	return res;
};

int main(){
	int n, k;
	cin >> n >> k;
	MAX = (1 << k) - 1;
	vector<int> a(n);
	cin >> a;
	int q;
	cin >> q;
	vector<S> init;
	
	rep(i, n) init.emplace_back(a[i]);
	
	segtree<S, op, e> seg(init);
	rep(_, q){
		int t;
		cin >> t;
		if(t == 1){
			int i, val;
			cin >> i >> val;
			i--;
			seg.set(i, S(val));
		}
		if(t == 2){
			int l, r;
			cin >> l >> r;
			l--; r--;
			auto res = seg.prod(l, r + 1);
			int ans = res.ans;
//			cout << res.left;
//			cout << res.right;
			if(ans == INF) cout << "-1\n";
			else cout << ans << "\n";
		}
	}
	return 0;
}
0