Submission #1118306

#TimeUsernameProblemLanguageResultExecution timeMemory
1118306ZflopHorses (IOI15_horses)C++14
17 / 100
324 ms56980 KiB
#include <bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; #define ll long long const int NMAX = (int)1e5 * 5; const ll MOD = (int)1e9 + 7; int A[NMAX],B[NMAX],n; ll seg_produs[NMAX * 4],seg_maxim[NMAX * 4]; void schimba_p(int i,ll v,int l,int r,int x) { if (l == r) { //cout << i << ' ' << x << ' ' << v << '\n'; seg_produs[x] = v; return; } int mid = (l + r) / 2; if (i <= mid) schimba_p(i,v,l,mid,2 * x); else schimba_p(i,v,mid + 1,r,2 * x + 1); seg_produs[x] = seg_produs[2 * x] * seg_produs[2 * x + 1] % MOD; //cout << l << ' ' << r << ' ' << seg_produs[x] << ' ' << v << '\n'; } ll get_p(int a,int b,int l,int r,int x) { if (a <= l && r <= b) return seg_produs[x]; if (r < a || b < l) return 1; int mid = (l + r) / 2; return get_p(a,b,l,mid,2 * x) * get_p(a,b,mid + 1,r,2 * x + 1) % MOD; } void schimba_m(int i,ll v,int l,int r,int x) { if (l == r) { seg_maxim[x] = v; return; } int mid = (l + r) / 2; if (i <= mid) schimba_m(i,v,l,mid,2 * x); else schimba_m(i,v,mid + 1,r,2 * x + 1); seg_maxim[x] = max(seg_maxim[2 * x],seg_maxim[2 * x + 1]); } ll get_m(int a,int b,int l,int r,int x) { if (a <= l && r <= b) return seg_maxim[x]; if (r < a || b < l) return 0; int mid = (l + r) / 2; return max(get_m(a,b,l,mid,2 * x),get_m(a,b,mid + 1,r,2 * x + 1)); } ll POW(ll x,int p) { ll res = 1; while (p) { if (p % 2) res = res * x % MOD; p /= 2; x = x * x % MOD; } return res; } set<int>p; int afla () { ll ans = 0; ll prev_y = 0; auto g = p.end(); for (int i = min(30,(int)p.size()); i;--i) { --g; //cout << i << ' ' << *g << '\n'; } ll x = 1; while (g != p.end()) { int i = *g; //cout << i << ' ' << n + 1 << '\m';; if (i == n + 1) break; auto r = g; ++r; int j = *r; //cout << i << ' ' << j << '\n'; bool ok = false; x = x * A[i]; if (x * A[i] > prev_y) ok = true; ll b = get_m(i,j - 1,1,n,1); if (x * b > prev_y) ok = true; if (ok) { x = 1; ans = get_p(1,i,1,n,1) * b % MOD; prev_y = b; } ++g; } return (int)ans; } int init(int N, int X[], int Y[]) { p.clear(); n = N; for (int i = 0; i < N * 4 + 20;++i) seg_produs[i] = 1; p.insert(1); for (int i = 1; i <= N;++i) { A[i] = X[i - 1]; B[i] = Y[i - 1]; //cout << A[i] << '\n'; schimba_p(i,A[i],1,N,1); schimba_m(i,B[i],1,N,1); if (A[i] > 1) p.insert(i); } p.insert(N + 1); return afla(); } int updateX(int pos, int val) { ++pos; A[pos] = val; schimba_p(pos,val,1,n,1); if (A[pos] >= 2) p.insert(pos); else if (pos != 1) p.erase(pos); return afla(); } int updateY(int pos, int val) { ++pos; B[pos] = val; schimba_m(pos,val,1,n,1); return afla(); }
#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...