#include "horses.h"
#include <iostream>
#include <cmath>
#include <unordered_map>
#include <map>
#include <set>
#include <queue>
#include <vector>
#include <string>
#include <iomanip>
#include <algorithm>
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
using namespace std;
typedef long long ll;
ll linf = 1e15+1;
inline void scoobydoobydoo(){
ios::sync_with_stdio(false);
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
}
const int M = 1e9+7;
const int MAXN = 5e5+1;
long double X[MAXN], Y[MAXN];
struct Node {
long double sum;
long double maxi;
ll index;
};
Node ST[4*MAXN];
int leftOf[4*MAXN], rightOf[4*MAXN];
int indexToNode[MAXN];
void buildTree(int l, int r, int node = 1){
leftOf[node] = l; rightOf[node] = r;
if (l == r){
indexToNode[l] = node;
ST[node].index = l;
ST[node].maxi = log2(Y[l]);
ST[node].sum = log2(X[l]);
return;
}
int mid = (l+r)>>1;
buildTree(l, mid, 2*node);
buildTree(mid+1, r, 2*node+1);
ST[node].sum = ST[2*node].sum + ST[2*node+1].sum;
if (ST[2*node].maxi > ST[2*node+1].maxi+ST[2*node].sum){
ST[node].index = ST[2*node].index;
ST[node].maxi = ST[2*node].maxi;
} else {
ST[node].index = ST[2*node+1].index;
ST[node].maxi = ST[2*node+1].maxi+ST[2*node].sum;
}
return;
}
int query(){
long double rest = ST[1].maxi - floor(ST[1].maxi);
ll bigi = ST[1].maxi;
ll soFar = 2;
long double ans = 1;
for (int i = 0; i <= log2(bigi)+1; i++){
if (bigi&(1<<i)){
ans = ((ll)ans*soFar)%M;
}
soFar *= soFar;
soFar %= M;
}
ans *= pow(2.0, rest);
return ((ll)round(ans))%M;
}
void update1(int node){
if (!node)return;
ST[node].sum = ST[2*node].sum + ST[2*node+1].sum;
if (ST[2*node].maxi > ST[2*node+1].maxi+ST[2*node].sum){
ST[node].index = ST[2*node].index;
ST[node].maxi = ST[2*node].maxi;
} else {
ST[node].index = ST[2*node+1].index;
ST[node].maxi = ST[2*node+1].maxi+ST[2*node].sum;
}
update1(node>>1);
}
int updateX(int pos, int val){
ST[indexToNode[pos]].sum = log2((long double)val);
update1(indexToNode[pos]>>1);
return query();
}
int updateY(int pos, int val){
ST[indexToNode[pos]].maxi = log2((long double)val);
update1(indexToNode[pos]>>1);
return query();
}
int init(int n, int x[], int y[]) {
for(int i = 0; i < n; i++){
X[i] = x[i];
Y[i] = y[i];
}
buildTree(0, n-1);
return query();
}
Compilation message
horses.cpp: In function 'int query()':
horses.cpp:68:21: warning: conversion from 'long double' to 'll' {aka 'long long int'} may change value [-Wfloat-conversion]
68 | ll bigi = ST[1].maxi;
| ~~~~~~^~~~
horses.cpp:81:28: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
81 | return ((ll)round(ans))%M;
| ~~~~~~~~~~~~~~~~^~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2 ms |
10584 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
10588 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
190 ms |
88916 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
10840 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2 ms |
10588 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |