Cod sursa(job #1954790)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 5 aprilie 2017 17:28:43
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<fstream>
#include<algorithm>
#define f first
#define s second
#define DIM 100005
using namespace std;
int c, n, m, i, st, dr, mid, x, y, sol;
int sum[DIM];
pair<int, int> v[DIM], p1, p2;
ifstream fin("gropi.in");
ofstream fout("gropi.out");
int main(){
    fin>> c >> n;
    for(i = 1; i <= n; i++){
        fin>> v[i].s >> v[i].f;
    }
    sort(v + 1, v + n + 1);
    for(i = 2; i <= n; i++){
        sum[i] = sum[i - 1];
        if(v[i].s != v[i - 1].s){
            sum[i]++;
        }
    }
    fin>> m;
    for(; m; m--){
        fin>> p1.s >> p1.f >> p2.s >> p2.f;
        st = 1;
        dr = n;
        while(st <= dr){
            mid = (st + dr) / 2;
            if(v[mid].f >= min(p1.f, p2.f)){
                dr = mid - 1;
            }
            else{
                st = mid + 1;
            }
        }
        x = st;
        st = 1;
        dr = n;
        while(st <= dr){
            mid = (st + dr) / 2;
            if(v[mid].f <= max(p1.f, p2.f)){
                st = mid + 1;
            }
            else{
                dr = mid - 1;
            }
        }
        y = dr;
        sol = max(p1.f, p2.f) - min(p1.f, p2.f) + 1;
        if(x <= y){
            sol += sum[y] - sum[x] + 1;
            if( (p1.f < p2.f && p1.s != v[x].s) || (p1.f > p2.f && p1.s != v[y].s) ){
                sol--;
            }
            if( (p2.f > p1.f && p2.s == v[y].s) || (p2.f < p1.f && p2.s == v[x].s) ){
                sol++;
            }
        }
        else{
            if(p1.s != p2.s){
                sol++;
            }
        }
        fout<< sol <<"\n";
    }
    return 0;
}