Pagini recente » Cod sursa (job #159212) | Cod sursa (job #1920528) | Cod sursa (job #3031187) | Cod sursa (job #3203569) | Cod sursa (job #1663685)
#include<iostream>
#include<stdio.h>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
struct node{
int sum;
node *left, *right;
};
node *ptree[10005];
int a[10005],l,r,x,y,n,q,vmax=1002;
string fis;
int f_idx;
int parse(){
int rez=0;
while ( f_idx<fis.length() && (fis[f_idx]<'0' || fis[f_idx]>'9') ) ++f_idx;
while ( fis[f_idx]>='0' && fis[f_idx]<='9') { rez=rez*10+fis[f_idx]-'0'; ++f_idx; }
return rez;
}
node *build_empty_tree(int l, int r) {
if (l==r) {
node *cn=new node();
cn->sum=0;
cn->left=0;
cn->right=0;
return cn;
}
else {
int mid=(l+r)/2;
node *cn=new node();
cn->left=build_empty_tree(l,mid);
cn->right=build_empty_tree(mid+1,r);
cn->sum=0;
return cn;
}
}
node *update(node *cn,int l, int r, int poz) {
if (l==r) {
node *dup=new node();
dup->left=0;
dup->right=0;
dup->sum=cn->sum+1;
return dup;
}
else {
int mid=(l+r)/2;
node *dup=new node();
if (poz<=mid) {
dup->right=cn->right;
dup->left=update(cn->left,l,mid,poz);
}
else {
dup->left=cn->left;
dup->right=update(cn->right,mid+1,r,poz);
}
dup->sum=dup->left->sum+dup->right->sum;
return dup;
}
}
int query(node *cn,int l, int r) {
if (l>=x && r<=y) return cn->sum;
else {
int mid=(l+r)/2;
int v=0;
if (x<=mid) v+=query(cn->left,l,mid);
if (y>mid) v+=query(cn->right,mid+1,r);
return v;
}
}
int main(void) {
ifstream cin("qxy.in");
ofstream cout("qxy.out");
getline(cin,fis,char(EOF));
f_idx=0;
n=parse();
ptree[0]=build_empty_tree(1,vmax);
for (int i=1; i<=n; ++i) {
a[i]=parse();
++a[i];
ptree[i]=update(ptree[i-1],1,vmax,a[i]);
}
q=parse();
for (int i=1; i<=q; ++i) {
l=parse();
r=parse();
x=parse();
y=parse();
++x; ++y;
cout<<query(ptree[r],1,vmax)-query(ptree[l-1],1,vmax)<<"\n";
}
return 0;
}