Cod sursa(job #2492494)

Utilizator Alexandru_StoianStoian Sorin Alexandru Alexandru_Stoian Data 14 noiembrie 2019 20:25:18
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("sequencequery.in");
ofstream g("sequencequery.out");

int n,m,in,sf,x,s;
int sums[400001],sumd[400001],sum[400001],sumsd[400001];


long long M(long long x, long long y){
    if(x>y)
        return x;
    else
        return y;
}

void updt(int nod, int st, int dr, int poz, int val){
    if(st==dr){
        sum[nod]=sumd[nod]=sums[nod]=sumsd[nod]=val;
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)updt(nod*2,st,mij,poz,val);
    else updt(nod*2+1,mij+1,dr,poz,val);
    sums[nod]=M(sums[nod*2],sum[nod*2]+sums[nod*2+1]);
    sumd[nod]=M(sumd[nod*2+1],sum[nod*2+1]+sumd[nod*2]);
    sumsd[nod]=M(M(sumsd[nod*2],sumsd[nod*2+1]),sumd[nod*2]+sums[nod*2+1]);
    sum[nod]=sum[nod*2]+sum[nod*2+1];
}

void qry(int nod, int st, int dr){
    if(in<=st && dr<=sf){
        s=s+sumsd[nod];
        return;
    }
    int mij=(st+dr)/2;
    if(in<=mij)qry(nod*2,st,mij);
    if(mij<sf)qry(nod*2+1,mij+1,dr);
}

void build(int nod, int st, int dr){
    if(st==dr){
        sums[nod]=sumd[nod]=sumsd[nod];
        return;
    }
    int mij=(st+dr)/2;
    build(nod*2,st,mij);
    build(nod*2+1,mij+1,dr);
}

int main(){
    f>>n>>m;

    build(1,1,n);

    for(int i=1; i<=n; ++i){
        f>>x;
        updt(1,1,n,i,x);
    }
    for(int i=1; i<=m; ++i){
        f>>in>>sf;
        s=0;
        qry(1,1,n);
        g<<s<<'\n';
        g<<'\n';
    }
    return 0;
}