제출 #1330681

#제출 시각아이디문제언어결과실행 시간메모리
1330681tkm_algorithms말 (IOI15_horses)C++20
37 / 100
122 ms25372 KiB
#include "horses.h"
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
//#define int ll
using P = pair<int, int>;
#define all(x) x.begin(), x.end()
#define rep(i, l, n) for (int i = l; i < (n); ++i)
#define sz(x) (int)x.size()
const char nl = '\n';
const ll mod = 1e9+7;
//const ll inf = 1e9+1;

struct segtree {
	vector<ll> tree;
	int size;
	
	void init(int n) {
		size = 1;
		while (size < n)size <<= 1;
		tree.assign(2*size-1, 0);
	}
	
	void set(int i, int v, int x, int lx, int rx) {
		if (rx-lx == 1) {
			tree[x] = v;
			return;
		}
		int mid = lx+rx>>1;
		if(i<mid)set(i, v, 2*x+1, lx, mid);
		else set(i, v, 2*x+2, mid, rx);
		tree[x] = tree[2*x+1]*tree[2*x+2]%mod;
	}
	
	void set(int i, int v) {
		set(i, v, 0, 0, size);
	}
	
	int get(int r, int x, int lx, int rx) {
		if (r <= lx)return 1ll;
		if (rx <= r)return tree[x];
		int mid = lx+rx>>1;
		ll p1 = get(r, 2*x+1, lx, mid);
		ll p2 = get(r, 2*x+2, mid, rx);
		ll j = p1*p2%mod;
		return j;
	}
	
	int get(int r) {
		return get(r, 0, 0, size);
	}
};

int n;
vector<ll> x, y;
vector<ll> p;
segtree st;

int init(int N, int X[], int Y[]) {
	n = N;
	rep(i, 0, n)
		x.push_back(X[i]),
		y.push_back(Y[i]);
		
	st.init(n);	
	
	p.resize(n);
	rep(i, 0, n) {
		st.set(i, x[i]);
		p[i] = x[i];
		if (i)p[i] = p[i-1]*p[i]%mod;
	}
		
	ll res = 0, yp = Y[0], pr = 1;
	rep(i, 1, n) {
		pr = min(mod, pr*x[i]);
		if (pr*y[i] > yp) {
			res = i, yp = y[i];
			pr = 1;
		}
	}
	
	ll ans = 1;
	rep(i, 0, res+1)
		ans = ans*x[i]%mod;
	ll j = st.get(res+1)*y[res]%mod;
	return j;
}

int updateX(int pos, int val) {	
	x[pos] = val; st.set(pos, val);
	ll res = 0, yp = 0, pr = 1;
	rep(i, max(n-30, 0), n) {
		pr = min(mod, pr*x[i]);
		if (pr*y[i] > yp) {
			res = i, yp = y[i];
			pr = 1;
		}
	}
	
	ll j = st.get(res+1)*y[res]%mod;
	return j;
}

int updateY(int pos, int val) {
	y[pos] = val;
	ll res = 0, yp = 0, pr = 1;
	rep(i, max(n-30, 0), n) {
		pr = min(mod, pr*x[i]);
		if (pr*y[i] > yp) {
			res = i, yp = y[i];
			pr = 1;
		}
	}
	
	ll ans = p[res];
	ll j = st.get(res+1)*y[res]%mod;
	return j;
}
#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...