Submission #1185811

#TimeUsernameProblemLanguageResultExecution timeMemory
1185811GabpHorses (IOI15_horses)C++20
Compilation error
0 ms0 KiB
#include<bits/stdc++.h>
using namespace std;

const long long int MOD = 1e9 + 7;
const long long int INF = 2e9;
int n;

struct SegTree {
  vector<long long int> x,y,left,right,mult;
  vector<int> idx;
  
  SegTree() {}
  
  SegTree(int n, int X[], int Y[]) {
    x.resize(n);
    y.resize(n);
    left.resize(4 * n);
    right.resize(4 * n);
    mult.resize(4 * n);
    idx.resize(4 * n);
    
    for (int i = 0; i < n; i++) {
      x[i] = X[i];
      y[i] = Y[i];
    }
    
    build(1, 0, n - 1);
  }
  
  void merge(int v) {
    mult[v] = mult[2 * v] * mult[2 * v + 1] % MOD;
    
    long long int check = min(INF, right[2 * v] * left[2 * v + 1]);
    if (y[idx[2 * v]] >= y[idx[2 * v + 1]] * check) {
      idx[v] = idx[2 * v];
      left[v] = left[2 * v];
      right[v] = min(INF, min(INF, right[2 * v] * left[2 * v + 1]) * right[2 * v + 1]);
    } else {
      idx[v] = idx[2 * v + 1];
      left[v] = min(INF, min(INF, left[2 * v] * right[2 * v]) * left[2 * v + 1]);
      right[v] = right[2 * v + 1];
    }
  }
  
  void build(int v, int tl, int tr) {
    if (tl == tr) {
      left[v] = x[tl];
      idx[v] = tl;
      mult[v] = x[tl];
      right[v] = 1;
      return;
    }
    
    int mid = tl + (tr - tl) / 2;
    build(2 * v, tl, mid);
    build(2 * v + 1, mid + 1, tr);
    merge(v);
  }
  
  void update(int v, int tl, int tr, int id) {
    if (tl == tr) {
      left[v] = x[tl];
      idx[v] = tl;
      mult[v] = x[tl];
      right[v] = 1;
      return;
    }
    
    int mid = tl + (tr - tl) / 2;
    if (id <= mid) update(2 * v, tl, mid, id);
    else update(2 * v + 1, mid + 1, tr, id);
    merge(v);
  }
  
  long long int query(int v, int tl, int tr, int l, int r) {
    if (l > r) return 1;
    if (tl == l && tr == r) return mult[v];
    
    int mid = tl + (tr - tl) / 2;
    return (query(2 * v, tl, mid, l, min(mid, r)) * query(2 * v + 1, mid + 1, tr, max(mid + 1, l), r)) % MOD;
  }
  
  long long int getAns() {
    return query(1, 0, n - 1, 0, idx[1]) * y[idx[1]] % MOD;
  }
}

SegTree st;

int init(int N, int X[], int Y[]) {
  n = N;
  st = SegTree(N, X, Y);
  return st.getAns();
}

int updateX(int pos, int val) {
  st.x[pos] = val;
  st.update(1, 0, n - 1, pos);
  return st.getAns();
}

int updateY(int pos, int val) {
  st.y[pos] = val;
  st.update(1, 0, n - 1, pos);
  return st.getAns();
}

Compilation message (stderr)

horses.cpp:88:9: error: expected initializer before 'st'
   88 | SegTree st;
      |         ^~
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:92:3: error: 'st' was not declared in this scope; did you mean 'std'?
   92 |   st = SegTree(N, X, Y);
      |   ^~
      |   std
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:97:3: error: 'st' was not declared in this scope; did you mean 'std'?
   97 |   st.x[pos] = val;
      |   ^~
      |   std
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:103:3: error: 'st' was not declared in this scope; did you mean 'std'?
  103 |   st.y[pos] = val;
      |   ^~
      |   std