Cod sursa(job #2422788)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 19 mai 2019 21:25:56
Problema Gropi Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <map>
#include <cstdio>
#include <map>
#include <set>
#include <iostream>


using namespace std;

const int N = 100000 + 7;
int c, n;
int x[N], y[N];
int ty[N];
int w[N], taki = 0;
map <int, int> rrr;
int ch[N];

int after(int p) {
        int l = 1, r = taki;
        int a = -1;
        while(l <= r) {
                int m = (l + r) / 2;
                if(p <= w[m]) {
                        a = m;
                        r = m - 1;
                } else {
                        l = m + 1;
                }
        }
        return a;
}

int before(int p) {
        int l = 1, r = taki;
        int a = -1;
        while(l <= r) {
                int m = (l + r) / 2;
                if(w[m] <= p) {
                        a = m;
                        l = m + 1;
                } else {
                        r = m - 1;
                }
        }
        return a;
}

int main() {
        freopen("gropi.in", "r", stdin);
        freopen("gropi.out", "w", stdout);
        cin >> c >> n;
        set<int>ys;
        for(int i = 1; i <= n; i++) {
                cin >> x[i] >> y[i];
                ys.insert(y[i]);
        }
        for(auto &x : ys)
                w[++taki] = x, rrr[w[taki]] = taki;
        for(int i = 1; i <= n; i++) {
                y[i] = rrr[y[i]];
                ty[y[i]] += x[i];
        }
        int rumba = 0;
        for(int i = 1; i <= taki; i++) {
                rumba += (ty[i] != ty[i - 1]);
                ch[i] = rumba;
        }
        int q;
        cin >> q;
        while(q--) {
                int r1, c1, r2, c2;
                cin >> r1 >> c1 >> r2 >> c2;
                if(c1 > c2) {
                        swap(c1, c2);
                        swap(r1, r2);
                }
                int dst = c2 - c1 + 1;
                int p1 = after(c1 + 1);
                int p2 = before(c2 - 1);
                if(p1 != -1 && p2 != -1 && p1 <= p2) {
                        dst += ch[p2] - ch[p1];
                        dst += (ty[p1] == r1);
                        dst += (ty[p2] == r2);
                } else {
                        dst += (r1 != r2);
                }
                cout << dst << "\n";
        }
        return 0;
}