Cod sursa(job #2363688)

Utilizator dacianouaPapadia Mortala dacianoua Data 3 martie 2019 15:09:17
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <stdio.h>
#define dim 20000
#define nmax 100000
using namespace std;
FILE *fin=fopen("arbint.in","r");
FILE *fout=fopen("arbint.out","w");
int arb[nmax<<2+5],n,m,poz;
char buffer[dim];
int maxv(int x, int y)
{
    return x>y?x:y;
}
void read(int &x)
{
    x=0;
    while(buffer[poz]<'0' || buffer[poz]>'9')
        if(++poz==dim)
        fread(buffer,1,dim,fin),poz=0;
    while(buffer[poz]>='0' && buffer[poz]<='9')
    {
        x=x*10+buffer[poz]-'0';
        if(++poz==dim)
        fread(buffer,1,dim,fin),poz=0;
    }
}
void update(int val,int poz, int nod, int st, int dr)
{
    if(st==dr)
    {
        arb[nod]=val;
        return;
    }
    int mid=(st+dr)>>1;
    if(mid>=poz)
        update(val,poz,nod<<1,st,mid);
    else
        update(val,poz,(nod<<1)+1,mid+1,dr);
    arb[nod]=maxv(arb[nod<<1],arb[(nod<<1)+1]);
}
int querry(int l, int r, int nod, int st, int dr)
{
    if(l<=st && dr<=r)
        return arb[nod];
    int mid=(st+dr)>>1,sol=0;
    if(mid>=l)
        sol=maxv(sol,querry(l,r,nod<<1,st,mid));
    if(mid<r)
        sol=maxv(sol,querry(l,r,(nod<<1)+1,mid+1,dr));
    return sol;
}
int main()
{
    int var1,var2,var3;
    read(n);
    read(m);
    for(int i=1;i<=n;i++)
        read(var1),update(var1,i,1,1,n);
    for(int i=1;i<=m;i++)
    {
        read(var3);
        switch(var3)
        {
        case 0:
            read(var1);
            read(var2);
            fprintf(fout,"%d\n",querry(var1,var2,1,1,n));
            break;
        case 1:
            read(var1);
            read(var2);
            update(var2,var1,1,1,n);
        }
    }
    return 0;
}