Cod sursa(job #1771964)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 6 octombrie 2016 12:27:45
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.28 kb
#include <stdio.h>
#include <ctype.h>
#define BUF_SIZE 131072
#define MAXP 262144
#define MAX_N 100000
#define max(a,b) a>b? a:b
int aint[MAXP],v[MAX_N+1];
char buf[BUF_SIZE],buf2[BUF_SIZE];
FILE *fin,*fout;
int pos=BUF_SIZE,pos2,left,right,maxim,poz;
inline char getch()
{
    if(pos==BUF_SIZE)
    {
        fread(buf,BUF_SIZE,1,fin);
        pos=0;
    }
    return buf[pos++];
}
inline int Read()
{
    int x=0;
    char ch=getch();
    while(!isdigit(ch))
        ch=getch();
    do
    {
        x=x*10+ch-'0';
        ch=getch();
    } while(isdigit(ch));
    return x;
}
inline void putch(char ch)
{
    buf2[pos2++]=ch;
    if(pos2==BUF_SIZE)
    {
        fwrite(buf2,BUF_SIZE,1,fout);
        pos2=0;
    }
}
inline void Write(int x)
{
    char s[10];
    int k=0;
    do
    {
        s[k++]=x%10+'0';
        x/=10;
    } while(x);
    while(k--)
        putch(s[k]);
}
void dfs(int p,int st,int dr)
{
    if(st==dr)
        aint[p]=v[st];
    else
    {
        int m=(st+dr)/2;
        dfs(2*p,st,m);
        dfs(2*p+1,m+1,dr);
        aint[p]=max(aint[2*p],aint[2*p+1]);
    }
}
void query(int p,int st,int dr)
{
    if(left<=st && dr<=right)
        maxim=max(maxim,aint[p]);
    else
    {
        int m=(st+dr)/2;
        if(left<=m)
            query(2*p,st,m);
        if(m<right)
            query(2*p+1,m+1,dr);
    }
}
void update(int p,int st,int dr)
{
    if(st==dr)
        aint[p]=v[st];
    else
    {
        int m=(st+dr)/2;
        if(poz<=m)
            update(2*p,st,m);
        else
            update(2*p+1,m+1,dr);
        aint[p]=max(aint[2*p],aint[2*p+1]);
    }
}
int main()
{
    fin=fopen("arbint.in","r");
    fout=fopen("arbint.out","w");
    int i,m,n,a,b,c;
    n=Read();m=Read();
    for(i=1;i<=n;i++)
        v[i]=Read();
    dfs(1,1,n);
    for(i=0;i<m;i++)
    {
        a=Read();b=Read();c=Read();
        if(!a)
        {
            left=b;right=c;
            maxim=0;
            query(1,1,n);
            Write(maxim);
            putch('\n');
        }
        else
        {
            poz=b;
            v[b]=c;
            update(1,1,n);
        }
    }
    if(pos2)
        fwrite(buf2,pos2,1,fout);
    fclose(fin);
    fclose(fout);
    return 0;
}