Submission #826707

#TimeUsernameProblemLanguageResultExecution timeMemory
826707Pichon5Index (COCI21_index)C++17
110 / 110
2432 ms137172 KiB
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <string>
#include <sstream>
#include <fstream>
#include <cmath>
#include <queue>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <bitset>
#include <bits/stdc++.h>
#define lcm(a,b) (a/__gcd(a,b))*b
#define ke ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define pb push_back
#define F first
#define S second
#define vi vector<int>
#define ll long long
using namespace std;
const int tam=200005;
int a[tam];
struct st{
    st * izq;
    st * der;
    int val;
};
st * P[tam];
st * init(int b, int e){
    int mid=(b+e)/2;
    st * nuevo=new st;
    if(b==e){
        nuevo->val=0;
        return nuevo;
    }
    st * A=init(b,mid);
    st * B=init(mid+1,e);
    nuevo->val=A->val+B->val;
    nuevo->izq=A;
    nuevo->der=B;
    return nuevo;
}

st * update(st * nodo, int b, int e, int pos, int valor){
   int mid=(b+e)/2;
   st * nuevo = new st;
   nuevo->izq=nodo->izq;
   nuevo->der=nodo->der;
   nuevo->val=nodo->val;
   if(b==e){
      nuevo->val=nodo->val+valor;
      return nuevo;
   }
   if(pos<=mid){
      nuevo->izq=update(nodo->izq,b,mid,pos,valor);
   }else{
      nuevo->der=update(nodo->der,mid+1,e,pos,valor);
   }
   nuevo->val=nuevo->izq->val + nuevo->der->val;
   return nuevo;
}

int query(st * nodo, int b, int e, int izq, int der){
    int mid=(b+e)/2;
    if(b>=izq && e<=der){
        return nodo->val;
    }
    if(der<=mid){
        return query(nodo->izq,b,mid,izq,der);
    }else{
        if(izq>=mid+1){
            return query(nodo->der,mid+1,e,izq,der);
        }else{
            return query(nodo->izq,b,mid,izq,der) + query(nodo->der,mid+1,e,izq,der);
        }
    }
}

int main(){
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }   
    P[0]=init(0,tam-1);
    for(int i=1;i<=n;i++){
        P[i]=update(P[i-1],0,tam-1,a[i],1);
    }
    int izq,der; 
    while(q--){
        cin>>izq>>der;
        int b=0,e=der-izq+1;
        int res=0;
        while(b<=e){
            int mid=(b+e)/2;
            //quiero probar si mi respuesta es mid
            int QR=query(P[der],0,tam-1,mid,tam-1);
            int QL=query(P[izq-1],0,tam-1,mid,tam-1);
            if(QR-QL>=mid){
                res=mid;
                b=mid+1;
            }else{
                e=mid-1;
            }
        }
        cout<<res<<endl;


    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...