Submission #153958

#TimeUsernameProblemLanguageResultExecution timeMemory
153958ivandasfsHorses (IOI15_horses)C++14
Compilation error
0 ms0 KiB
#include <iostream> #include <algorithm> #include <vector> #include <set> using namespace std; typedef long long ll; const ll MOD = 1e9+7; vector <ll> vX; vector <ll> vY; set <pair<int, int> > jed; ll umno[3000005]; ll maxi[3000005]; int n; int off; void umno_update(int node, ll val) { if (!node) return ; if (node >= off) { umno[node] = val; } else { umno[node] = (umno[node*2] * umno[node*2+1]) % MOD; } umno_update(node/2, val); } ll umno_query(int x, int y, int l, int r, int node) { if (l>y or r<x) return 1LL; if (l>=x and r<=y) return umno[node]; return (umno_query(x, y, l, (l+r)/2, node*2) * umno_query(x, y, (l+r)/2+1, r, node*2+1)) % MOD; } void maxi_update(int node, ll val) { if (!node) return ; if (node >= off) { maxi[node] = val; } else { maxi[node] = max(maxi[node*2], maxi[node*2+1]); } maxi_update(node/2, val); } ll maxi_query(int x, int y, int l, int r, int node) { if (l>y or r<x) return 0LL; if (l>=x and r<=x) return maxi[node]; return max(maxi_query(x, y, l, (l+r)/2, node*2), maxi_query(x, y, (l+r)/2+1, r, node*2+1)); } int init(int m, int *v, int *w) { n = m; off = 1; while (off<n) off*=2; for (int i=0 ; i<n ; i++) { vX.push_back(v[i]); vY.push_back(w[i]); umno_update(i+off, vX[i]); maxi_update(i+off, vY[i]); } vX.push_back(-1); for (int i=0 ; i<n ; i++) { if (vX[i]==1) { int st = i; while (vX[i]==1) i++; jed.insert(make_pair(st, i-1)); } } vX.pop_back(); ll suff = 1; bool over = false; for (int i=n-1 ; i>=0 ; i--) { if (over) { return (umno_query(0, i, 0, off-1, 1) * suff) % MOD; } suff = max(suff * vX[i], vY[i] * vX[i]); if (suff >= MOD) { over = true; suff %= MOD; } } return suff; } ll calculate() { ll suff = 1; bool over = false; for (int i=n-1 ; i>=0 ; i--) { if (over) { return (umno_query(0, i, 0, off-1, 1) * suff) % MOD; } if (vX[i] == 1) { set <pair<int, int> > :: iterator it = jed.lower_bound(make_pair(i, i+1)); it--; // cout << it -> first << " " << it -> second << endl; ll best = maxi_query(it -> first, it -> second, 0, off-1, 1); suff = max(suff, best); i = (it -> first); } else { suff = max(suff * vX[i], vY[i] * vX[i]); if (suff >= MOD) { over = true; suff %= MOD; } } // cout <<"suff = "<<suff<<endl; } return suff; } int updateX(int pos, ll val) { int bio = vX[pos]; vX[pos] = val; umno_update(pos+off, val); if (bio == 1) { set <pair<int, int> > :: iterator it = jed.lower_bound(make_pair(pos, 10000000)); it--; pair <int, int> p = *it; pair <int, int> l = make_pair(p.first, pos-1); pair <int, int> r = make_pair(pos+1, p.second); jed.erase(it); if (l.first <= l.second) jed.insert(l); if (r.first <= r.second) jed.insert(r); } if (val == 1) { jed.insert(make_pair(pos, pos)); set <pair <int, int> > :: iterator l, r, it; it = jed.lower_bound(make_pair(pos, pos)); r = it; l = it; if (l != jed.begin()) { l--; if (l -> second == pos - 1) { pair <int, int> newp = make_pair(l -> first, pos); jed.erase(l); jed.erase(it); jed.insert(newp); it = jed.find(newp); } } r++; if (r != jed.end()) { if (r -> first == pos+1) { pair <int, int> newp = make_pair(it -> first, r -> second); jed.erase(it); jed.erase(r); jed.insert(newp); } } } return calculate(); } int updateY(int pos, ll val) { vY[pos] = val; maxi_update(pos+off, val); return calculate(); } /* int main() { int m; cin >>m; vector <int> a; vector <int> b; for (int i=0 ; i<m ; i++) { int x; cin >>x; a.push_back(x); } for (int i=0 ; i<m ; i++) { int x; cin >>x; b.push_back(x); } cout <<init(m, a, b)<<endl; int q; cin >>q; for (int i=0 ; i<q ; i++) { char c; int pos, val; cin >>c>>pos>>val; if (c=='X') cout <<updateX(pos, val)<<endl; else cout <<updateY(pos, val)<<endl; } return 0; } */

Compilation message (stderr)

horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:79:50: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
    return (umno_query(0, i, 0, off-1, 1) * suff) % MOD;
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp:87:9: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
  return suff;
         ^~~~
horses.cpp: In function 'int updateX(int, ll)':
horses.cpp:117:18: warning: conversion to 'int' from '__gnu_cxx::__alloc_traits<std::allocator<long long int> >::value_type {aka long long int}' may alter its value [-Wconversion]
  int bio = vX[pos];
                  ^
horses.cpp:156:18: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
  return calculate();
         ~~~~~~~~~^~
horses.cpp: In function 'int updateY(int, ll)':
horses.cpp:162:18: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
  return calculate();
         ~~~~~~~~~^~
/tmp/cczZZJFY.o: In function `main':
grader.c:(.text.startup+0x71a): undefined reference to `updateX(int, int)'
grader.c:(.text.startup+0x8a6): undefined reference to `updateY(int, int)'
collect2: error: ld returned 1 exit status