Submission #248389

#TimeUsernameProblemLanguageResultExecution timeMemory
248389lycHorses (IOI15_horses)C++14
100 / 100
1028 ms115832 KiB
#include "horses.h"
#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) cerr << #x << " :: " << x << endl
#define _ << " " <<
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(),(x).end()
using ll=long long;
using ii=pair<int,int>;

const int mxN = 5e5+5;
const int mod = 1e9+7;

int N, X[mxN], Y[mxN];

struct node {
    int s, e, m;
    int px, idx;
    long double v, lz;

    node *l, *r;
    node(int s, int e): s(s), e(e), m((s+e)/2), px(0), idx(s), v(0), lz(0) {
        if (s != e) {
            l = new node(s,m);
            r = new node(m+1,e);
        }
    }

    long double val() {
        if (lz != 0) {
            v += lz;
            if (s != e) {
                l->lz += lz;
                r->lz += lz;
            }
            lz = 0;
        }
        return v;
    }

    void recalc() {
        if (l->val() > r->val()) v = l->val(), idx = l->idx;
        else v = r->val(), idx = r->idx;
    }

    void ux(int i, int x) {
        if (s == e) { px = x; return; }
        if (i <= m) l->ux(i,x);
        else r->ux(i,x);
        px = 1LL * l->px * r->px % mod;
    }

    void av(int i, double x) {
        if (s == e) { v += x; return; }
        else if (i <= m) l->av(i,x);
        else r->av(i,x);
        val();
        recalc();
    }

    void av(int i, int j, double x) {
        if (s == i && e == j) { lz += x; return; }
        if (j <= m) l->av(i,j,x);
        else if (i > m) r->av(i,j,x);
        else l->av(i,m,x), r->av(m+1,j,x);
        val();
        recalc();
    }

    int qx(int i, int j) {
        if (s == i && e == j) return px;
        if (j <= m) return l->qx(i,j);
        if (i > m) return r->qx(i,j);
        return 1LL * l->qx(i,m) * r->qx(m+1,j) % mod;
    }

    void dbg() {
        if (s == e) {
            cout << s << " :: " << px _ idx _ v _ lz << endl;
        } else l->dbg(), r->dbg();
    }
} *root;

int calc() { return 1LL * root->qx(0,root->idx) * Y[root->idx] % mod; }

int init(int _N, int _X[], int _Y[]) {
    N = _N;
    root = new node(0,N-1);
    FOR(i,0,N-1) {
        X[i] = _X[i], Y[i] = _Y[i];
        root->ux(i,X[i]);
        root->av(i,N-1,log10(X[i]));
        root->av(i,log10(Y[i]));
    }
    return calc();
}

int updateX(int pos, int val) {	
    root->av(pos,N-1,-log10(X[pos]));
    X[pos] = val;
    root->ux(pos,val);
    root->av(pos,N-1,log10(val));
    return calc();
}

int updateY(int pos, int val) {
    root->av(pos,-log10(Y[pos]));
    Y[pos] = val;
    root->av(pos,log10(val));
	return calc();
}

Compilation message (stderr)

horses.cpp: In constructor 'node::node(int, int)':
horses.cpp:25:23: warning: declaration of 'e' shadows a member of 'node' [-Wshadow]
     node(int s, int e): s(s), e(e), m((s+e)/2), px(0), idx(s), v(0), lz(0) {
                       ^
horses.cpp:20:12: note: shadowed declaration is here
     int s, e, m;
            ^
horses.cpp:25:23: warning: declaration of 's' shadows a member of 'node' [-Wshadow]
     node(int s, int e): s(s), e(e), m((s+e)/2), px(0), idx(s), v(0), lz(0) {
                       ^
horses.cpp:20:9: note: shadowed declaration is here
     int s, e, m;
         ^
horses.cpp: In member function 'void node::ux(int, int)':
horses.cpp:53:34: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
         px = 1LL * l->px * r->px % mod;
              ~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In member function 'int node::qx(int, int)':
horses.cpp:77:48: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
         return 1LL * l->qx(i,m) * r->qx(m+1,j) % mod;
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int calc()':
horses.cpp:87:64: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
 int calc() { return 1LL * root->qx(0,root->idx) * Y[root->idx] % 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...