Cod sursa(job #1760450)

Utilizator CatalinOlaruCatalin Olaru CatalinOlaru Data 20 septembrie 2016 20:20:55
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<fstream>
#include<iostream>
#include<ctime>
#define MAX_LEN 100005
#define MININT 0
#define max(a,b) ((a<b)?b:a)
using namespace std;
int vec[MAX_LEN];
int arb[262145];
int x=1;
void buildTree(int low, int high, int pos,int N)
{

    if(low>=N)
        return;
    if(low==high) {
        arb[pos] = vec[low];
        return;
    }
    int mid=(high+low)/2;
    buildTree(low,mid,2*pos+1,N);
    buildTree(mid+1,high,2*pos+2,N);
    arb[pos]=max(arb[2*pos+1],arb[2*pos+2]);
}

int maxim=0;
void query(int qlow,int qhigh,int low, int high, int pos)
{

    if(qlow<=low && qhigh >= high) {
        maxim = max(maxim, arb[pos]);
        return;
    }
    if(qlow>high || qhigh<low)
        return;
    int mid=(low+high)/2;
    if(qlow<=mid && maxim < arb[pos<<1+1])
        query(qlow,qhigh,low,mid,2*pos+1);
    if(qhigh>mid && maxim < arb[pos<<1+2])
        query(qlow,qhigh,mid+1,high,2*pos+2);
}

void update( int ind,int value )
{
    int pos=x+ind;
    arb[pos]=value;
    while(pos!=0)
    {
        pos=(pos-1)>>1;
        arb[pos]=max(arb[2*pos+1],arb[2*pos+2]);
    }
}
int main()
{
    clock_t begin = clock();
    int N,M;
    fstream f,g;
    f.open("arbint.in",ios::in);
    g.open("arbint.out",ios::out);
    f>>N>>M;
    int i=0;
    for(i=0;i<N;i++)
        f>>vec[i];

    while(x<N)
        x*=2;
    x--;

    buildTree(0,x,0,N);

    int A,B,C;
    for(i=0;i<M;i++)
    {
        f>>A>>B>>C;
        if(A==0) {
            maxim=0;
            query(B - 1, C - 1, 0, x, 0);
            g << maxim << endl;
        }
        else
            update(B-1,C);
    }
    clock_t end = clock();
    float elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
    cout<<elapsed_secs<<endl;
}