제출 #1327782

#제출 시각아이디문제언어결과실행 시간메모리
1327782settop말 (IOI15_horses)C++20
100 / 100
170 ms46012 KiB
#include "horses.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(),x.end()
#define sz(x) (int)x.size()
const ll inf=1e18;
const int MAXN=5e5+10;
const ll MOD=1e9+7;

struct node{
	ll id,lp,rp;
	bool modl,modr;
};

int n;
ll x[MAXN],y[MAXN];
node seg[4*MAXN];

node merge(node a,node b){
	node c;
	ll pro=a.rp*b.lp;
	bool md=0;
	if(pro>MOD) md=1,pro%=MOD;
	pro*=x[b.id];
	if(pro>MOD) md=1,pro%=MOD;
	if(a.modr || b.modl || md || pro*y[b.id]>y[a.id]){
		c.id=b.id;
		c.modl=a.modl|b.modl|a.modr;
		c.lp=a.lp*b.lp;
		if(c.lp>MOD) c.lp%=MOD,c.modl=1;
		c.lp*=a.rp;
		if(c.lp>MOD) c.lp%=MOD,c.modl=1;
		c.lp*=x[a.id];
		if(c.lp>MOD) c.lp%=MOD,c.modl=1;
		c.modr=b.modr;
		c.rp=b.rp;
	}
	else{
		c.id=a.id;
		c.modr=a.modr|b.modr|b.modl;
		c.rp=a.rp*b.lp;
		if(c.rp>MOD) c.rp%=MOD,c.modr=1;
		c.rp*=b.rp;
		if(c.rp>MOD) c.rp%=MOD,c.modr=1;
		c.rp*=x[b.id];
		if(c.rp>MOD) c.rp%=MOD,c.modr=1;
		c.modl=a.modl;
		c.lp=a.lp;
	}
	return c;
}

void build(int ind,int l,int r){
	if(l==r){
		seg[ind].id=l;
		seg[ind].lp=1;
		seg[ind].rp=1;
		seg[ind].modl=seg[ind].modr=0;
		return;
	}
	int m=(l+r)/2; build(2*ind,l,m); build(2*ind+1,m+1,r);
	seg[ind]=merge(seg[2*ind],seg[2*ind+1]);
}

void updt(int ind,int l,int r,int a){
	if(l==r) return;
	int m=(l+r)/2;
	if(a<=m) updt(2*ind,l,m,a);
	else updt(2*ind+1,m+1,r,a);
	seg[ind]=merge(seg[2*ind],seg[2*ind+1]);
}

int init(int N, int X[], int Y[]){
	n=N;
	fall(i,0,n-1) x[i]=X[i],y[i]=Y[i];

	build(1,0,n-1);

	ll ans=x[seg[1].id]*seg[1].lp % MOD * y[seg[1].id] % MOD;
	return ans;
}

int updateX(int pos, int val){
	x[pos]=val;
	updt(1,0,n-1,pos);	
	ll ans=x[seg[1].id]*seg[1].lp % MOD * y[seg[1].id] % MOD;
	return ans;
}

int updateY(int pos, int val) {
	y[pos]=val;
	updt(1,0,n-1,pos);	
	ll ans=x[seg[1].id]*seg[1].lp % MOD * y[seg[1].id] % MOD;
	return ans;
}
#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...