Cod sursa(job #2422815)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 19 mai 2019 22:39:38
Problema Gropi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.72 kb
#include <cstdio>
#include <algorithm>
#include <iostream>

using namespace std;

#define buff_size 104576
char buff[buff_size];
int pos = 0;

inline void read(int &nr) {
        while(!isdigit(buff[pos]))
                if(++pos == buff_size)
                        fread(buff,  1, buff_size, stdin), pos = 0;
        nr = 0;
        while(isdigit(buff[pos])) {
                nr = (nr << 1) + (nr << 3) + buff[pos] - 48;
                if(++pos == buff_size)
                        fread(buff, 1, buff_size, stdin), pos = 0;
        }
}
const int N = 100000 + 7;
int c, n;
int x[N], y[N];
int ty[N];
int w[N], taki = 0;
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;
}

struct info {
        int y, i;
};

info a[N];

bool cmp1(info a, info b) {
        return a.y < b.y;
}
bool cmp2(info a, info b) {
        return a.i < b.i;
}

char outBuff[buff_size];
int outPtr;

inline void putChar(const char &C) {
        outBuff[outPtr++] = C;
        if (outPtr == buff_size) {
                fwrite(outBuff, 1, buff_size, stdout);
                outPtr = 0;
        }
}

inline  void write(int X) {
        static char digs[10];
        int n = 0, q;
        do {
                q = X / 10;
                digs[n++] = X - (q << 1) - (q << 3) + 48;

                X = q;
        } while (X);
        while (n--) {
                putChar(digs[n]);
        }
        putChar(' ');
}

int main() {
        freopen("gropi.in", "r", stdin);
        freopen("gropi.out", "w", stdout);
        read(c);
        read(n);
        for(int i = 1; i <= n; i++) {
                read(x[i]);
                read(a[i].y);
                a[i].i = i;
        }
        sort(a + 1, a + n + 1, cmp1);
        for(int i = 1; i <= n; i++) {
                if(a[i].y != a[i - 1].y)
                        w[++taki] = a[i].y,
                                    a[i].y = taki;
        }
        sort(a + 1, a + n + 1, cmp2);
        for(int i = 1; i <= n; i++) {
                ty[a[i].y] += x[i];
        }
        int rumba = 0;
        for(int i = 1; i <= taki; i++) {
                rumba += (ty[i] != ty[i - 1]);
                ch[i] = rumba;
        }
        int q;
        read(q);
        for(int jj = 1; jj <= q; jj++) {
                int r1, c1, r2, c2;
                read(r1);
                read(c1);
                read(r2);
                read(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);
                }
                write(dst);
                putChar('\n');
        }
        fwrite(outBuff, 1, outPtr, stdout);
        return 0;
}