Cod sursa(job #2329914)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 27 ianuarie 2019 17:43:48
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.47 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;

struct UF
{
        vector<int>t;
        void build(int n)
        {
                t.resize(n+1);
                for(int i=1;i<=n;i++)
                {
                        t[i]=i;
                }
        }
        int dad(int a)
        {
                if(a==t[a])
                {
                        return a;
                }
                else
                {
                        t[a]=dad(t[a]);
                        return t[a];
                }
        }
        void uni(int a,int b)
        {
                a=dad(a);
                b=dad(b);
                if(a!=b)
                {
                        t[a]=b;
                }
        }
        bool same(int a,int b)
        {
                return (dad(a)==dad(b));
        }
};

struct RMQ_MAX
{
        vector<vector<int>>ret;
        vector<int>mylog;
        void build(int n,int a[])
        {
                ret.resize(n+1);
                mylog.resize(n+1);
                for(int i=2;i<=n;i++)
                {
                        mylog[i]=1+mylog[i/2];
                }
                for(int i=1;i<=n;i++)
                {
                        ret[i].resize(mylog[n]+1,-(1<<30));
                        ret[i][0]=a[i];
                }
                for(int k=1;(1<<k)<=n;k++)
                {
                        for(int i=1;i+(1<<k)-1<=n;i++)
                        {
                                ret[i][k]=max(ret[i][k-1],ret[i+(1<<(k-1))][k-1]);
                        }
                }
        }
        int ask(int l,int r)
        {
                int k=mylog[r-l+1];
                return max(ret[l][k],ret[r-(1<<k)+1][k]);
        }
};

struct RMQ_MIN
{
        vector<vector<int>>ret;
        vector<int>mylog;
        void build(int n,int a[])
        {
                ret.resize(n+1);
                mylog.resize(n+1);
                for(int i=2;i<=n;i++)
                {
                        mylog[i]=1+mylog[i/2];
                }
                for(int i=1;i<=n;i++)
                {
                        ret[i].resize(mylog[n]+1,(1<<30));
                        ret[i][0]=a[i];
                }
                for(int k=1;(1<<k)<=n;k++)
                {
                        for(int i=1;i+(1<<k)-1<=n;i++)
                        {
                                ret[i][k]=min(ret[i][k-1],ret[i+(1<<(k-1))][k-1]);
                        }
                }
        }
        int ask(int l,int r)
        {
                int k=mylog[r-l+1];
                return min(ret[l][k],ret[r-(1<<k)+1][k]);
        }
};

#define read(FILENAME) freopen((FILENAME+".in").c_str(),"r",stdin)
#define write(FILENAME) freopen((FILENAME+".out").c_str(),"w",stdout)
#define files(FILENAME) read(FILENAME),write(FILENAME)

const string FILENAME="rmq";

const int N=(int)1e5+7;

int n,q;
int a[N];

int main()
{
        //ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
        files(FILENAME);
        cin>>n>>q;
        for(int i=1;i<=n;i++)
        {
                cin>>a[i];
        }
        RMQ_MIN kek;
        cout<<"LOL\n";
        kek.build(n,a);
        cout<<"LOL\n";
        while(q--)
        {
                int l,r;
                cin>>l>>r;
                cout<<kek.ask(l,r)<<"\n";
        }
        return 0;
}
/**

**/