Cod sursa(job #2693356)

Utilizator Arsene_DenisaArsene Denisa Arsene_Denisa Data 5 ianuarie 2021 16:36:43
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.29 kb
#include <iostream>
#include<fstream>
#include<math.h>
#include<algorithm>

struct ura {
    int st, dr, buc, ind;
} a[100001];

int v[100001], r[100001];

bool cmp(ura w, ura z) {
        if(w.buc>z.buc) {
                   return false;

    }
        if(w.buc==z.buc) {
                    if(w.dr>z.dr) {
                                return false;

        }

    }
                    return true;
}

using namespace std;

int main() {
        int n, q, i, k, x, y, dro, drp, max, mini, b, maxa, mina, minou, minim;

        ifstream fin("rmq.in");
        ofstream fout("rmq.out");
        fin>>n>>q;
         k=n/((int)sqrt(q));
        for(i=1; i<=n; i++) {
                    fin>>v[i];

    }
        for(i=1; i<=q; i++) {
                    fin>>a[i].st>>a[i].dr;
                    a[i].buc=a[i].st/k+1;

        a[i].ind=i;

    }
        sort(a+1,a+q+1, cmp);
        i=1;
        while(i<=q) {
                b=a[i].buc;
        dro=a[i].dr;
       int stg=1;
           minou=1000000000;
            while(b==a[i].buc) {
                    drp=a[i].dr;

                    if(dro==drp && stg==1) {
                            stg=0;
                for(y=b*k; y<=drp; y++) {
                if(minou>v[y]) {
                        minou=v[y];
                }
                }
            }
            else {
                if(dro>=b*k && drp>=b*k) {
                for(y=dro+1; y<=drp; y++) {
                 if(minou>v[y]) {
                        minou=v[y];
                }
                }
                }
                else {
                    for(y=b*k; y<=drp; y++) {
                 if(minou>v[y]) {
                        minou=v[y];
                }
                }
            }
            }
           minim=minou;
           int lol=min(b*k-1, a[i].dr);
                        for(x=a[i].st; x<=lol; x++) {
                 if(minou>v[x]) {
                        minou=v[x];
                }
                        }
                r[a[i].ind]=minou;
                minou=minim;
                dro=drp;
            i++;
            }
            i--;
            i++;
        }
        for(i=1;i<=q;i++) {
          fout<<r[i]<<"\n";
        }


            return 0;
    }