結果

問題 No.2901 Logical Sum of Substring
ユーザー 👑 binapbinap
提出日時 2024-09-21 05:53:27
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 3,855 bytes
コンパイル時間 5,125 ms
コンパイル使用メモリ 277,164 KB
実行使用メモリ 95,268 KB
最終ジャッジ日時 2024-09-21 05:53:42
合計ジャッジ時間 14,162 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 3 ms
5,376 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 WA -
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 WA -
testcase_27 WA -
testcase_28 WA -
testcase_29 WA -
testcase_30 WA -
testcase_31 WA -
権限があれば一括ダウンロードができます

ソースコード

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 = INF;
	int len;
	S(int x = -1){
		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){
	S res;
	res.left = a.left;
	res.right = b.right;
	res.len = a.len + b.len;
	
	if(a.len == 0) return b;
	if(b.len == 0) return a;
	
	res.ans = min(a.ans, b.ans);
	{
		int m = b.left.size();
		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(a.all() == prod){
				res.left.back().second += time;
			}else{
				res.left.emplace_back(prod, time);
			}
			len += time;
		}
	}
	
	{
		int m = a.right.size();
		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(b.all() == prod){
				res.right.back().second += time;
			}else{
				res.right.emplace_back(prod, time);
			}
			len += time;
		}
	}
	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