Cod sursa(job #1776334)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 11 octombrie 2016 10:26:29
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia2-arborideintervale Marime 2.3 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define MaxT 265000
#define MaxN 100001
#define MAX 131072
using namespace std;
 
FILE *IN,*OUT;
int N,M,T[MaxT],pos=0,v[MaxN],Start,End,Type,Ans,P,Val,out=0;
char f[MAX],Out[MAX],str[10];
inline void Write_Ch(char ch)
{
    Out[out++]=ch;
    if(out==MAX)
        fwrite(Out,MAX,1,OUT),out=0;
}
inline void Write_Int(int nr)
{
    int x=0;
    do
    {
        str[x++]=nr%10+'0';
        nr/=10;
    }
    while(nr);
    while(x>0)
        Write_Ch(str[--x]);
}
inline int max2(int a,int b)
{
    if (a>b) return a;
    else return b;
}
inline void Read(int &nr)
{
    nr=0;
    while(f[pos]<'0'||f[pos]>'9')
    {
        pos++;
        if(pos==MAX)
            fread(f,MAX,1,IN),pos=0;
    }
    while(f[pos]>='0'&&f[pos]<='9')
    {
        nr=10*nr+f[pos++]-'0';
        if(pos==MAX)
            fread(f,MAX,1,IN),pos=0;
    }
}
void DFS(int node,int start,int end)
{
    if(start==end)
    {
        T[node]=v[start];
        return;
    }
    DFS(node*2,start,(start+end)>>1);
    DFS(node*2+1,((start+end)>>1)+1,end);
    T[node]=max2(T[node*2],T[node*2+1]);
}
void Update(int node,int start,int end)
{
    if(start==end)
    {
        T[node]=Val;
        return;
    }
    int mid=(start+end)>>1;
    if(P>mid)
        Update(node*2+1,mid+1,end);
    else Update(node*2,start,mid);
    T[node]=max2(T[2*node],T[2*node+1]);
}
void Query(int node,int start,int end)
{
    if(start>=Start&&end<=End)
        Ans=max2(Ans,T[node]);
    else
    {
        int mid=(start+end)>>1;
        if (Start<=mid)
            Query(node*2,start,mid);
        if(End>mid) Query(node*2+1,mid+1,end);
    }
}
int main()
{
    IN=fopen("arbint.in","r");
    OUT=fopen("arbint.out","w");
    fread(f,1,MAX,IN);
    Read(N);
    Read(M);
    for(int i=1;i<=N;i++)
        Read(v[i]);
    DFS(1,1,N);
    for(int i=1;i<=M;i++)
    {
        Read(Type);
        if(!Type)
        {
            Read(Start),Read(End);
            Ans=0;
            Query(1,1,N);
            Write_Int(Ans);
            Write_Ch('\n');
        }
        else
        {
            Read(P),Read(Val);
            Update(1,1,N);
        }
    }
    if(out>0)fwrite(Out,1,out,OUT);
    return 0;
}