제출 #1174165

#제출 시각아이디문제언어결과실행 시간메모리
1174165ivazivaIndex (COCI21_index)C++20
60 / 110
2601 ms132492 KiB
#include <bits/stdc++.h>

using namespace std;

struct Node{
    Node *l,*r;int sum;
    Node(int val):l(nullptr),r(nullptr),sum(val){}
    Node(Node *l,Node *r):l(l),r(r),sum(0){
        if (l!=nullptr) sum+=l->sum;
        if (r!=nullptr) sum+=r->sum;
    }
    Node(Node *cp):l(cp->l),r(cp->r),sum(cp->sum){}
};

#define MAXN 200001

int n,q;
Node* root[MAXN];

Node* build(int l,int r)
{
    if (l==r) return new Node(0);
    int mid=(l+r)/2;return new Node(build(l,mid),build(mid+1,r));
}

Node* update(Node* node,int l,int r,int pos,int val)
{
    if (l==r) return new Node(node->sum+val);
    int mid=(l+r)/2;
    if (pos<=mid) return new Node(update(node->l,l,mid,pos,val),node->r);
    else return new Node(node->l,update(node->r,mid+1,r,pos,val));
}

int query(Node* node,int l,int r,int a,int b)
{
    if (a>b) return 0;
    if (l==a and r==b) return node->sum;
    int mid=(l+r)/2;
    return query(node->l,l,mid,a,min(b,mid))+query(node->r,mid+1,r,max(a,mid+1),b);
}

int main()
{
    ios_base::sync_with_stdio(false);ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);cin>>n>>q;root[0]=build(1,200000);int maks=0;
    for (int i=1;i<=n;i++) {int x;cin>>x;root[i]=update(root[i-1],1,n,x,1);maks=max(maks,x);}
    for (int i=1;i<=q;i++)
    {
        int levo,desno;cin>>levo>>desno;
        int l=2,r=desno-levo+1,rez=1;
        while (l<=r)
        {
            int mid=(l+r)/2;
            if (query(root[desno],1,n,mid,maks)-query(root[levo-1],1,n,mid,maks)>=mid) {rez=mid;l=mid+1;}
            else r=mid-1;
        }
        cout<<rez<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...