Cod sursa(job #2176204)

Utilizator catalina200029Olteanu Catalina catalina200029 Data 16 martie 2018 21:33:01
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>
#define nmax 100005

using namespace std;

FILE*f=fopen("arbint.in","r");
FILE*g=fopen("arbint.out","w");

int n,m,ai[5*nmax],v[nmax];

void adaug(int k,int a,int b,int poz,int w) {
    if (a==b) ai[poz]=k;
    else {
        int m=(a+b)/2;
        if (m>=w) adaug(k,a,m,poz*2,w);
        else adaug(k,m+1,b,poz*2+1,w);
        ai[poz]=max(ai[poz*2],ai[poz*2+1]);
    }
}

int interog(int a,int b,int st,int dr,int poz) {
    if (st<=a && b<=dr) return ai[poz];
    else {
        int m=(a+b)/2;
        int k=0;
        if (st<=m) k=interog(a,m,st,dr,poz*2);
        if (dr>m) k=max(interog(m+1,b,st,dr,poz*2+1),k);
        return k;
    }
}

int main() {
    int i,j,x,y,z;
    fscanf(f,"%d%d",&n,&m);
    for (i=1;i<=n;i++) {
        fscanf(f,"%d",&v[i]);
        adaug(v[i],1,n,1,i);
    }
    for (i=1;i<=m;i++) {
        fscanf(f,"%d%d%d",&x,&y,&z);
        if (x==0) fprintf(g,"%d\n",interog(1,n,y,z,1));
        else adaug(z,1,n,1,y);
        /*for (j=1;j<=2*n;j++)
            cout<<ai[j]<<' ';
        cout<<'\n';*/
    }
    return 0;
}