Cod sursa(job #1663685)

Utilizator VicktorVictor Teodor Stoian Vicktor Data 26 martie 2016 10:32:52
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#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;
}