Cod sursa(job #1616645)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 27 februarie 2016 11:40:54
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <iostream>
#define DIM 10005

using namespace std;

ifstream fin("qxy.in");
ofstream fout("qxy.out");

int N,Q,a,b,x,y,ans;

short arbmin[30000],arbmax[30000];

void build(int nod,int p,int u){
    if(p==u){
        fin >> arbmin[nod];
        arbmax[nod]=arbmin[nod];
        return;
    }

    int mid = (p+u)>>1;

    build(2*nod,p,mid);
    build(2*nod+1,mid+1,u);

    arbmin[nod]=min(arbmin[2*nod],arbmin[2*nod+1]);
    arbmax[nod]=max(arbmax[2*nod],arbmax[2*nod+1]);

}

void query(int nod,int p,int u){

    if(p==u){
        if(arbmin[nod]>=x && arbmax[nod]<=y)
            ans++;
        return;
    }

    if(p>=a && u<=b && arbmin[nod]>=x && arbmax[nod]<=y){
        ans+=u-p+1;
        return;
    }

    int mid = (p+u)>>1;

    if(a<=mid && (!arbmin[2*nod]>y || !arbmax[2*nod]<x))
        query(2*nod,p,mid);
    if(b>mid && (!arbmin[2*nod+1]>y || !arbmax[2*nod+1]<x))
        query(2*nod+1,mid+1,u);

}

int main(){

    fin >> N;

    build(1,1,N);

    fin >> Q;

    while(Q--){
        fin >> a >> b >> x >> y;
        ans=0;
        query(1,1,N);
        fout << ans << "\n";
    }


}