Cod sursa(job #2663664)

Utilizator stefan.popescuPopescu Stefan stefan.popescu Data 26 octombrie 2020 23:12:41
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.9 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <string>
#include <algorithm>
#include <unordered_map>
#include <type_traits>
#include <random>
#include <bitset>
#include <cstring>
#include <chrono>
#include <stack>
#include <stdlib.h>
#include <map>
#include <set>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define SERVER 0
const string nameFile="arbint";
ifstream in (nameFile+".in");
ofstream out(nameFile+".out");
typedef long long ll;
typedef pair <int, int> pii;
#if (SERVER)
    #define in cin
    #define out cout
#endif
const int RANDOM = chrono::high_resolution_clock::now().time_since_epoch().count();
struct chash {
    int operator()(int x) const { return x ^ RANDOM; }
};
struct segNode{
    int data;
    segNode (int vv=0){
        data=vv;
    }
    friend segNode operator + (segNode s1, segNode s2){
        return segNode(max(s1.data, s2.data));
    }
};
class segTree{
public:
    gp_hash_table <int, segNode, chash> seg;
    int segSize;
    segTree(int n){
        segSize=n;
    }
    void pointUpdate(int poz, int val){
        updateUtil(0, 0, segSize-1, poz, val);
    }
    segNode rangeQuery(int ll, int rr){
        return queryUtil(0, 0, segSize-1, ll, rr);
    }
private:
    inline segNode getAt(int poz){
        return (seg.find(poz)==seg.end()) ? segNode() : seg[poz];
    }
    void updateUtil(int poz, int ll, int rr, int pozQQ, int valQQ){
        if(pozQQ>rr||pozQQ<ll)
            return;
        if(ll==rr){
            seg[poz]=segNode(valQQ);
            return;
        }
        int mij=(ll+rr)/2;
        updateUtil(poz+1, ll, mij, pozQQ, valQQ);
        updateUtil(poz+2*(mij-ll+1), mij+1, rr, pozQQ, valQQ);
        seg[poz]=getAt(poz+1)+getAt(poz+2*(mij-ll+1));
    }
    segNode queryUtil(int poz, int ll, int rr, int llQ, int rrQ){
        if(llQ<=ll&&rr<=rrQ)
            return getAt(poz);
        int mij=(ll+rr)/2;
        if(llQ<=mij&&mij+1<=rrQ)
            return queryUtil(poz+1, ll, mij, llQ, rrQ)+queryUtil(poz+2*(mij-ll+1), mij+1, rr, llQ, rrQ);
        else if(llQ<=mij)
            return queryUtil(poz+1, ll, mij, llQ, rrQ);
        else if(mij+1<=rrQ)
            return queryUtil(poz+2*(mij-ll+1), mij+1, rr, llQ, rrQ);
    }
};


/*const int nmax=1e5;
int n, x;
int a[nmax+2];
vector <int> nr[nmax+2];*/
int n, qq, x, y, z;
int main()
{
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    /*in>>n;
    for(int i=1; i<=n; i++){
        in>>a[i];
        nr[a[i]].push_back(i);
    }*/

    in>>n>>qq;
    segTree arb(n+1);
    for(int i=1; i<=n; i++){
        in>>x;
        arb.pointUpdate(i, x);
    }
    for(int i=1; i<=qq; i++){
        in>>x>>y>>z;
        if(x==0)
            out<<arb.rangeQuery(y, z).data<<"\n";
        else
            arb.pointUpdate(y, z);
    }
    return 0;
}