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...