Submission #1342416

#TimeUsernameProblemLanguageResultExecution timeMemory
1342416sanoGame (IOI13_game)C++20
63 / 100
1147 ms281548 KiB
#include "game.h"
#include <iostream>
#include <vector>
#include <algorithm>
#define NEK 1000000000000
#define ll long long
#define vec vector
#define For(i, n) for(int i = 0; i < n; i++)
#define pii pair<int, int>
#define ff first
#define ss second
using namespace std;
 
ll nsd(ll a, ll b){
    if(a > b) swap(a, b);
    while(a){
        b %= a;
        swap(a, b);
    }
    return b;
}

class intervalac{
    ll n;
    struct node{
        ll sum = 0;
        node* l = nullptr;
        node* r = nullptr;
    };
    
    typedef node* pnode;
    pnode root = nullptr;

    ll get_sum(pnode s){
        if(!s) return (ll)0;
        return s->sum;
    }

    void update(pnode&s){
        s->sum = nsd(get_sum(s->l), get_sum(s->r));
        return;
    }

    void zmen(ll a, ll x, ll l, ll r, pnode& s){
        if(a < l || a > r) return;
        if(!s) s = new node;
        if(l == r){
            s->sum = x;
            return;
        }
        ll mid = (l+r)/2;
        zmen(a, x, l, mid, s->l); zmen(a, x, mid+1, r, s->r);
        update(s);
        return;
    }

    ll daj(ll a, ll b, ll l, ll r, pnode&s){
        if(a > r || b < l) return (ll)0;
        if(!s) return 0;
        if(a <= l && r <= b) return s->sum;
        ll mid = (l+r)/2;
        return nsd(daj(a, b, l, mid, s->l), daj(a, b, mid+1, r, s->r));
    }

public:
    intervalac(ll v){
        n = v;
    }
    void zmen_p(ll a, ll x){
        zmen(a, x, 0, n-1, root);
    }
    ll daj_p(ll a, ll b){
        return daj(a, b, 0, n-1, root);
    }
};


class intervalac2d{
    ll n;
    ll m;
    struct node{
        intervalac in;
        node* l = nullptr;
        node* r = nullptr;
        node(ll m) : in(m) {}
    };
    
    typedef node* pnode;
    pnode root = nullptr;

    ll get_range(pnode s, ll a, ll b){
        if(!s) return (ll)0;
        return s->in.daj_p(a, b);
    }

    void zmen(ll a, ll b, ll x, ll l, ll r, pnode& s){
        if(a < l || a > r) return;
        if(!s) s = new node(m);
        if(l == r){
            s->in.zmen_p(b, x);
            return;
        }
        ll mid = (l+r)/2;
        zmen(a, b, x, l, mid, s->l); zmen(a, b, x, mid+1, r, s->r);
        ll val = nsd(get_range(s->l, b, b), get_range(s->r, b, b));
        s->in.zmen_p(b, val);
        return;
    }

    ll daj(ll a, ll b, ll c, ll d, ll l, ll r, pnode&s){
        if(a > r || b < l) return (ll)0;
        if(!s) return 0;
        if(a <= l && r <= b) {
            return s->in.daj_p(c, d);
        }
        ll mid = (l+r)/2;
        return nsd(daj(a, b, c, d, l, mid, s->l), daj(a, b, c, d, mid+1, r, s->r));
    }

public:
    void postav(ll v1, ll v2){
        n = v1, m = v2;
    }
    void zmen_p(ll a, ll b, ll x){
        zmen(a, b, x, 0, n-1, root);
    }
    ll daj_p(ll a, ll b, ll c, ll d){
        return daj(a, b, c, d, 0, n-1, root);
    }
};

intervalac2d seg;


void init(int r1, int c1){
    ll r = r1, c = c1;
    seg.postav(r, c);
    return;
}

void update(int a1, int b1, ll k){
    ll a = a1, b = b1;
    seg.zmen_p(a, b, k);
    return;
}

ll calculate(int a1, int b1, int c1, int d1){
    ll a = a1, b = b1, c = c1, d = d1;
    return seg.daj_p(min(a, c), max(a, c), min(b, d), max(b, d));
}
#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...