Cod sursa(job #1953219)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 4 aprilie 2017 18:29:18
Problema Gropi Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
# include <fstream>
# include <algorithm>
# define DIM 100010
# define f first
# define s second
using namespace std;
ifstream fin("gropi.in");
ofstream fout("gropi.out");
pair<int,int> v[DIM];
int s[DIM],n,m,i,j,step,x,y,a,b,aux,sol;
int main () {
    fin>>x>>n;
    for(i=1;i<=n;i++){
        fin>>x>>y;
        v[i].f=y;
        v[i].s=3-x;
    }
    sort(v+1,v+n+1);
    for(i=2;i<=n;i++)
        if(v[i].s==v[i-1].s)
            s[i]=s[i-1]+v[i].f-v[i-1].f;
        else
            s[i]=s[i-1]+v[i].f-v[i-1].f+1;
    fin>>m;
    for(i=1;i<=m;i++){
        fin>>b>>a>>y>>x;
        if(a>x){
            swap(b,y);
            swap(a,x);
        }
        if(a==x){
            if(b!=y)
                fout<<"1\n";
            else
                fout<<"0\n";
            continue;
        }
        for(step=1;step<=n;step*=2);
        for(j=0;step;step/=2)
            if(j+step<=n&&v[j+step].f<a)
                j+=step;
        j++;
        aux=j;
        sol=v[j].f-a;
        if(b!=v[j].s)
            sol++;
        for(step=1;step<=n;step*=2);
        for(j=0;step;step/=2)
            if(j+step<=n&&v[j+step].f<=x)
                j+=step;
        sol+=x-v[j].f;
        if(y!=v[j].s)
            sol++;
        sol+=s[j]-s[aux];
        fout<<sol+1<<"\n";
    }
    return 0;
}