Monday, 17 August 2015

frequency of maximum no in a given range


find the frequency of maximum no in a given range ?

#include<iostream>
using namespace std;
int arr[1010000];
int tree[1010000];
#include<bits/stdc++.h>
list<int > li[10000000];
int laz[10100000];
#define inf -999999999
int query(int node,int start,int end,int r1,int r2)
 {

  if(start>end || r1>end || r2<start) return inf;
   if(laz[node])
   {
     tree[node]+=laz[node];
     laz[2*node]+=laz[node];
     laz[2*node+1]+=laz[node];
     laz[node]=0;
   }
   if(r1<=start && r2>=end)
    {
     return tree[node];
   
    }
    else
    {
     int q1=query(2*node,start,(start+end)/2,r1,r2);
     int q2=query(2*node+1,((start+end)/2)+1,end,r1,r2);
     return max(q1,q2);
    }
 }
void update(int node ,int start,int end,int r1,int r2,int val)
 {
  if(r1>end  || r2<start   || start>end) return  ;
  if(laz[node]!=0)
   {
   
    tree[node]+=laz[node];
    laz[2*node+1]+=laz[node];
    laz[2*node]+=laz[node];
    laz[node]=0;
   }
 
  if(r1<=start && r2>=end)
   {
     tree[node]+=val;
     if(start!=end)
      {
       laz[2*node]+=val;
       laz[2*node+1]+=val;
     
      }
      return  ;
   }
    update(2*node, start,(start+end)/2,r1,r2,val);
    update(2*node+1, ((start+end)/2)+1,end,r1,r2,val);
   tree[node]=min(tree[2*node],tree[2*node+1]);
 
 }
void build(int node , int start,int end)
 {
  if(start==end) tree[node]=arr[start];
  else if(start>end) return ;
  else
   {
    build(2*node,start,(start+end)/2);
    build(2*node+1,((start+end)/2)+1,end);
    tree[node]=max(tree[2*node],tree[2*node+1]);
   }
 
 }
int main()
 {
 
   int n,q;
    cin>>n>>q;
     for(int i=0;i<n;i++) cin>>arr[i];
      for(int i=0;i<n;i++)
       {
          li[arr[i]].push_back(i);
  }
     
       build(1,0,n-1);
 
     
   
        while(q--)
         {
          int ip;
         
             {
              int r1,r2;
               cin>>r1>>r2;
                r1-=1;
                r2-=1;
               
              int res= query(1,0,n-1,r1,r2);
               cout<<res<<endl;
                int count=0;
                 list<int> ::iterator it;
                  for(it=li[res].begin();it!=li[res].end();it++)
                   {
                     if(*it>=r1 && *it<=r2) count++;
  }
   cout<<count<<endl;
             }
         }
     
  return 0;
 }

No comments:

Post a Comment