Cod sursa(job #1304806)

Utilizator rebound212Mihnea Savu rebound212 Data 29 decembrie 2014 12:16:58
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include <algorithm>
#define DIM 10000
using namespace std;
char buff[DIM];
int poz=0;
int arb[1<<19],op,x,a,b,n,m,i,poz2;
void read ( int &numar)
{
    numar=0;
    while(buff[poz]<'0' | buff[poz]>'9')
    {
        if(++poz == DIM)
        {
            fread(buff,1,DIM,stdin);
            poz=0;
        }
    }
    while('0'<=buff[poz] && buff[poz]<='9')
    {
        numar=numar*10+buff[poz]-'0';
        if(++poz == DIM)
        {
            fread(buff,1,DIM,stdin);
            poz=0;
        }
    }

}


void actualizare ( int nod, int st, int dr )
{ int m;
    if(st>=poz2 && dr <=poz2)
    {
        arb[nod]=x;
        return;
    }

    m=(st+dr)/2;

        if(poz2<=m) actualizare ((nod<<1),st,m);
        else actualizare ((nod<<1)+1,m+1,dr);
        arb[nod]=max(arb[(nod<<1)], arb[(nod<<1)+1]);
}
int interogare(int nod, int st, int dr)
{
    int x1=0,x2=0;
    if(a<=st && b>=dr)
    {
        return arb[nod];
    }
    int  m=(st+dr)/2;
    if(a<=m)
    {
        x1=interogare(nod<<1,st,m);
    }
    if(b>m)
    {
        x2=interogare((nod<<1)+1,m+1,dr);
    }
    return max(x1,x2);
}
int main()
{
    freopen("saracsaurege.in","r",stdin);
    freopen("saracsaurege.out","w",stdout);
    scanf("%d %d",&n,&m);

    for(i=1; i<=n; i++)
    {
        read(x);
        poz2=i;
        actualizare (1,1,n);
    }
    for(i=1; i<=m; i++)
    {
       read(a);
       read(b);
       printf("%d\n",interogare(1,1,n));
    }
    return 0;
}