제출 #422030

#제출 시각아이디문제언어결과실행 시간메모리
422030_fractalNekameleoni (COCI15_nekameleoni)C++14
140 / 140
1918 ms420380 KiB
/** * author: fractal * timus: 288481RF **/ #include <bits/stdc++.h> using namespace std; #define F first #define S second #define mp make_pair #define pb push_back #define pf push_front #define ppb pop_back #define ppf pop_front #define speed ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define sz(x) (int)x.size() #define len(x) (int)strlen(x) #define all(x) x.begin(), x.end() #define debug cerr << "OK\n"; #define ub upper_bound #define lb lower_bound #define nl printf("\n"); #define clbuff fflush(stdin); #define make_unique(x) sort(all(x)), x.erase(unique(all(x)), x.end()) mt19937 bruh(chrono::steady_clock::now().time_since_epoch().count()); mt19937_64 rofl(chrono::steady_clock::now().time_since_epoch().count()); typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi; typedef vector<ll> vll; typedef vector<pii> vpii; typedef vector<pll> vpll; typedef set<int> si; typedef set<ll> sll; typedef set<pii> spii; typedef set<pll> spll; typedef multiset <int> msi; typedef multiset <ll> msll; typedef map <int, int> mi; typedef map <ll, ll> mll; const int N = 2e5 + 2; const int M = 1e5; const int mod = 0; const int inf = 2e9 + 3; const ll INF = 1e18; const ld pi2 = 2.0 * 3.141592; const ld pi = 3.141592; const ld eps = 1e-12; const int dx[4] = {1, -1, 0, 0}; const int dy[4] = {0, 0, -1, 1}; void files(string s = "main") { #ifndef PC freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout); #endif } int add(int a, int b) { if (a + b < 0) return a + b + mod; if (a + b >= mod) return a + b - mod; return a + b; } int mul(int a, int b) { return a * 1LL * b % mod; } int binpow(int a, int n) { int ret = 1; while (n) { if (n & 1) ret = mul(ret, a); a = mul(a, a); n >>= 1; } return ret; } int n, k, q; int a[N]; bitset<50> is; struct tree { int R[50][N << 2], L[50][N << 2], t[N << 2], cn[N << 2]; pii ls[N << 2][50]; int sz = 1; void merge(int v, int l, int r) { int x = 0, y = 0; cn[v] = 0; is.reset(); for (int i = 0; i < cn[r]; ++i) is[ls[r][i].S] = 1; for (int i = 0; i < cn[l]; ++i) if (is[ls[l][i].S] == 0) ls[v][cn[v]++] = ls[l][i]; for (int i = 0; i < cn[r]; ++i) ls[v][cn[v]++] = ls[r][i]; for (int i = 0; i < k; ++i) { L[i][v] = min(L[i][l], L[i][r]); R[i][v] = max(R[i][l], R[i][r]); } t[v] = min(t[l], t[r]); int ansr = 0; if (!cn[l]) return; is.reset(); for (int i = 0; i < cn[l]; ++i) is[ls[l][i].S] = 1; for (int i = 0; i < k; ++i) { if (is[i] == 0) { ansr = max(ansr, L[i][r]); if (ansr == inf) return; is[i] = 1; } } if (ansr) t[v] = min(t[v], ansr - ls[l][0].F + 1); for (int i = 0; i + 1 < cn[l]; ++i) { ansr = max(ansr, L[ls[l][i].S][r]); if (ansr == inf) return; t[v] = min(t[v], ansr - ls[l][i + 1].F + 1); } return; } void build() { int v = 0; for (int pos = 1; pos <= sz; ++pos) { v = pos + sz - 1; t[v] = (k == 1 && pos <= n ? 1 : inf); cn[v] = 0; for (int i = 0; i < k; ++i) { if (i == a[pos] && pos <= n) ls[v][cn[v]++] = {pos, i}; R[i][v] = (i == a[pos] && pos <= n ? pos : -inf); L[i][v] = (i == a[pos] && pos <= n ? pos : +inf); } } int z = 2; while (z <= sz) { for (int pos = 1; pos <= sz / z; ++pos) { v = pos + sz / z - 1; merge(v, v << 1, v << 1 | 1); } z <<= 1; } } void upd(int pos, int v = 0) { v = pos + sz - 1; t[v] = (k == 1 && pos <= n ? 1 : inf); cn[v] = 0; for (int i = 0; i < k; ++i) { if (i == a[pos] && pos <= n) ls[v][cn[v]++] = {pos, i}; R[i][v] = (i == a[pos] && pos <= n ? pos : -inf); L[i][v] = (i == a[pos] && pos <= n ? pos : +inf); } v >>= 1; while (v) { merge(v, v << 1, v << 1 | 1); v >>= 1; } } } t; int main() { speed; cin >> n >> k >> q; while (t.sz < n) t.sz <<= 1; for (int i = 1; i <= n; ++i) { cin >> a[i], a[i]--; } t.build(); while (q--) { int tp, p, x; cin >> tp; if (tp == 1) { cin >> p >> x; a[p] = x - 1; t.upd(p); } else { cout << (t.t[1] == inf ? -1 : t.t[1]) << '\n'; } } }

컴파일 시 표준 에러 (stderr) 메시지

nekameleoni.cpp: In function 'int mul(int, int)':
nekameleoni.cpp:74:21: warning: division by zero [-Wdiv-by-zero]
   74 |  return a * 1LL * b % mod;
      |         ~~~~~~~~~~~~^~~~~
nekameleoni.cpp: In member function 'void tree::merge(int, int, int)':
nekameleoni.cpp:97:7: warning: unused variable 'x' [-Wunused-variable]
   97 |   int x = 0, y = 0;
      |       ^
nekameleoni.cpp:97:14: warning: unused variable 'y' [-Wunused-variable]
   97 |   int x = 0, y = 0;
      |              ^
nekameleoni.cpp: In function 'void files(std::string)':
nekameleoni.cpp:62:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |   freopen((s + ".in").c_str(), "r", stdin);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
nekameleoni.cpp:63:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   63 |   freopen((s + ".out").c_str(), "w", stdout);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...