Cod sursa(job #1614315)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 25 februarie 2016 21:37:47
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <cstdio>
#include <vector>
#include <algorithm>
struct mycreation{
    int x, y, d;
    bool t;
};
int c;
std::vector <int> v[2];
std::vector <mycreation>e[2];
inline int myabs(int x){
    if(x<0){
        return -x;
    }
    return x;
}
inline void calc(int l){
    int a=1, i;
    mycreation r;
    for(i=0; i<(int)v[l].size(); i++){
        if(a<v[l][i]){
            r.x=a;
            r.y=v[l][i]-1;
            r.t=0;
            r.d=0;
            e[l].push_back(r);
        }
        a=v[l][i]+1;
    }
    if(a<=c){
        r.x=a;
        r.y=c;
        r.t=0;
        r.d=0;
        e[l].push_back(r);
    }
}
int main(){
    int n, i, x, y, j, u, ans, p, q, m, a, b, pas;
    FILE *fin, *fout;
    fin=fopen("gropi.in", "r");
    fout=fopen("gropi.out", "w");
    fscanf(fin, "%d%d", &c, &n);
    for(i=0; i<n; i++){
        fscanf(fin, "%d%d", &x, &y);
        v[x-1].push_back(y);
    }
    std::sort(v[0].begin(), v[0].end());
    std::sort(v[1].begin(), v[1].end());
    calc(0);
    calc(1);
    u=0;
    i=0;
    j=0;
    while((i<(int)e[0].size())||(j<(int)e[1].size())){
        u++;
        if(u%2==1){
            e[0][i].t=1;
            e[0][i].d=u;
            while((j<(int)e[1].size())&&(e[1][j].y<=e[0][i].y)){
                e[1][j].d=i;
                j++;
            }
            i++;
        }else{
            e[1][j].t=1;
            e[1][j].d=u;
            while((i<(int)e[0].size())&&(e[0][i].y<=e[1][j].y)){
                e[0][i].d=j;
                i++;
            }
            j++;
        }
    }
    fscanf(fin, "%d", &m);
    for(i=0; i<m; i++){
        fscanf(fin, "%d%d%d%d", &x, &y, &a, &b);
        x--;
        a--;
        p=0;
        for(pas=1<<17; pas; pas>>=1){
            if((p+pas<(int)e[x].size())&&(e[x][p+pas].x<=y)){
                p+=pas;
            }
        }
        q=0;
        for(pas=1<<17; pas; pas>>=1){
            if((q+pas<(int)e[a].size())&&(e[a][q+pas].x<=b)){
                q+=pas;
            }
        }
        ans=myabs(y-b)+1;
        if((x!=a)||(p!=q)){
            if(e[x][p].t==0){
                p=e[x][p].d;
                x=1-x;
                ans++;
            }
            if(e[a][q].t==0){
                q=e[a][q].d;
                a=1-a;
                ans++;
            }
            ans+=myabs(e[x][p].d-e[a][q].d);
        }
        fprintf(fout, "%d\n", ans);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}