Pagini recente » Cod sursa (job #380358) | Cod sursa (job #594387) | Cod sursa (job #1220266) | Cod sursa (job #216727) | Cod sursa (job #1614315)
#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;
}