Submission #876470

#TimeUsernameProblemLanguageResultExecution timeMemory
876470TahirAliyev말 (IOI15_horses)C++17
100 / 100
787 ms36492 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int, int> const int MAX = 5e5 + 5, MOD = 1e9 + 7; int n; pii tree[4 * MAX]; int tree2[4 * MAX]; int x[MAX]; int y[MAX]; pii comb(pii a, pii b){ pii c = {0, 0}; if(a.first) c.first = 1; if(b.first) c.first = 1; if(1ll * a.second * b.second > 1e9) c.first = 1; c.second = (1ll * a.second * b.second) % MOD; return c; } void build(int node, int l, int r){ if(l == r){ tree[node] = {0, x[l]}; return; } int mid = (l + r) / 2; build(2 * node, l, mid); build(2 * node + 1, mid + 1, r); tree[node] = comb(tree[2 * node], tree[2 * node + 1]); } void updatex(int node, int l, int r, int pos, int val){ if(l == r){ tree[node] = {0, val}; return; } int mid = (l + r) / 2; if(pos <= mid){ updatex(2 * node, l, mid, pos, val); } else{ updatex(2 * node + 1, mid + 1, r, pos, val); } tree[node] = comb(tree[2 * node], tree[2 * node + 1]); } pii mult(int node, int l, int r, int ql, int qr){ if(qr < l || r < ql) return {0, 1}; if(ql <= l && r <= qr) return tree[node]; int mid = (l + r) / 2; return comb(mult(2 * node, l, mid, ql, qr), mult(2 * node + 1, mid + 1, r, ql, qr)); } int comb2(int a, int b){ if(b > a) swap(a, b); pii m = mult(1, 0, n - 1, b + 1, a); if(m.first) return a; if(1ll * m.second * y[a] > y[b]) return a; return b; } void build2(int node, int l, int r){ if(l == r){ tree2[node] = l; return; } int mid = (l + r) / 2; build2(2 * node, l, mid); build2(2 * node + 1, mid + 1, r); tree2[node] = comb2(tree2[2 * node], tree2[2 * node + 1]); } void updatey(int node, int l, int r, int pos){ if(l == r) return; int mid = (l + r) / 2; if(pos <= mid){ updatey(2 * node, l, mid, pos); } else{ updatey(2 * node + 1, mid + 1, r, pos); } tree2[node] = comb2(tree2[2 * node], tree2[2 * node + 1]); } int init(int N, int X[], int Y[]){ n = N; for(int i = 0; i < n; i++){ x[i] = X[i]; y[i] = Y[i]; } build(1, 0, n - 1); build2(1, 0, n - 1); int id = tree2[1]; return 1ll * mult(1, 0, n - 1, 0, id).second * y[id] % MOD; } int updateX(int pos, int val) { x[pos] = val; updatex(1, 0, n - 1, pos, val); updatey(1, 0, n - 1, pos); int id = tree2[1]; return 1ll * mult(1, 0, n - 1, 0, id).second * y[id] % MOD; } int updateY(int pos, int val) { y[pos] = val; updatey(1, 0, n - 1, pos); int id = tree2[1]; return 1ll * mult(1, 0, n - 1, 0, id).second * y[id] % MOD; }

Compilation message (stderr)

horses.cpp: In function 'std::pair<int, int> comb(std::pair<int, int>, std::pair<int, int>)':
horses.cpp:22:44: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   22 |     c.second = (1ll * a.second * b.second) % MOD;
      |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:99:58: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   99 |     return 1ll * mult(1, 0, n - 1, 0, id).second * y[id] % MOD;
      |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:107:58: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  107 |     return 1ll * mult(1, 0, n - 1, 0, id).second * y[id] % MOD;
      |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:114:58: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  114 |     return 1ll * mult(1, 0, n - 1, 0, id).second * y[id] % MOD;
      |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
#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...