Submission #1255207

#TimeUsernameProblemLanguageResultExecution timeMemory
1255207ZeroCoolHorses (IOI15_horses)C++20
100 / 100
125 ms54188 KiB
#include "horses.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int N = 5e5 + 20;
const int MOD = 1e9 + 7;
const int INF = 1e9 + 1;

int A[N], B[N];

namespace seggy{

	struct Node{
		int prod, opt, suf, pref;
		
		Node(int i){
			prod = pref = A[i];
			suf = 1;
			opt = i;
		}
		Node(){
			
		}
	};
	
	Node operator+(Node a,Node b){
		Node res;
		int p = min(INF, a.suf * b.pref);
		p = min(INF, p * B[b.opt]);
		if(p > B[a.opt]){
			res = b;
			res.pref = min(INF, res.pref * a.prod);
		}else{
			res = a;
			res.suf = min(INF, res.suf * b.prod);
		}
		res.prod = min(INF, a.prod * b.prod);
		return res;
	}

	Node s[4 * N];
	int p[4 * N];

	void bld(int k,int tl,int tr){
		if(tl == tr){
			s[k] = Node(tl);
			p[k] = A[tl];
			return;
		}
		int tm = (tl +tr) / 2;
		bld(k * 2, tl, tm);
		bld(k * 2 + 1, tm + 1, tr);
		s[k] = s[k * 2] + s[k * 2 + 1];
		p[k] = (p[k * 2] * p[k * 2 + 1]) % MOD;
	}

	void upd(int k,int tl,int tr,int i){
		if(tl == tr){
			s[k] = Node(tl);
			p[k] = A[tl];
			return;
		}
		int tm = (tl + tr) / 2;
		if(i <= tm)upd(k * 2, tl, tm, i);
		else upd(k * 2 + 1, tm + 1, tr, i);
		s[k] = s[k * 2] + s[k * 2 + 1];
		p[k] = (p[k * 2] * p[k * 2 + 1]) % MOD;
	}
	int qry(int k,int tl,int tr,int l,int r){
		if(l > tr || tl > r)return 1;
		if(l <= tl && tr <= r)return p[k];
		int tm = (tl + tr) / 2;
		return (qry(k * 2, tl, tm, l, r) * qry(k * 2 + 1, tm + 1, tr, l, r)) % MOD;
	}


};

int n;

signed init(signed _n, signed X[], signed Y[]) {
	n = _n;
	for(int i = 0;i < n;i++)A[i] = X[i], B[i] = Y[i];
	seggy::bld(1, 0, n - 1);
	int i = seggy::s[1].opt;
	return (seggy::qry(1, 0, n - 1, 0, i) * B[i]) % MOD;
}

signed updateX(signed pos, signed val) {	
	A[pos] = val;
	seggy::upd(1, 0, n - 1, pos);
	int i = seggy::s[1].opt;
	return (seggy::qry(1, 0, n - 1, 0, i) * B[i]) % MOD;
}

signed updateY(signed pos, signed val) {
	B[pos] = val;
	seggy::upd(1, 0, n - 1, pos);
	int i = seggy::s[1].opt;
	return (seggy::qry(1, 0, n - 1, 0, i) * B[i]) % MOD;
}

#define int signed

Compilation message (stderr)

horses.cpp:104: warning: "int" redefined
  104 | #define int signed
      | 
horses.cpp:4: note: this is the location of the previous definition
    4 | #define int long long
      |
#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...