Rezolvare completă PbInfo #1591 Intervalxy

Se dă un şir de N numere întregi. Definim costul intervalului [x, y], unde x si y apartin {1, 2, …, N}, ca fiind suma diferenţelor dintre numărul maxim din șir, aflat în interval şi restul numerelor aflate pe pozițiile x, x+1, …, y.
De exemplu, pentru şirul 2 4 7 4 3 -1 2 4 6 costul intervalului [3, 6] este 15. (explicație: 7-7+ 7-4 + 7-3 + 7+1 = 15).

Se definesc M operaţii de forma tip x y, astfel: Dacă tip este 1, atunci elementul de pe poziţia x din șir devine y. Dacă tip este 2, atunci să se afişeze costul intervalului [x, y];

Cerința

Să se determine răspunsul pentru fiecare operaţie de tipul 2.

Date de intrare

Fişierul de intrare intervalxy.in conţine:

  • Pe prima linie un număr natural N;
  • Pe cea de-a doua linie se află N numere, reprezentând elementele şirului;
  • Pe a treia linie se află un număr natural M.
  • Pe următoarele M linii se află câte un triplet tip x y cu proprietatea din enunţ.

Date de ieșire

Fişierul de iesire intervalxy.out conţine K linii, reprezentând răspunsul pentru fiecare operaţie de tipul 2, K fiind numărul de operaţii de tip 2 din fişierul de intrare.

Restricții și precizări

  • 2 <= N <= 100.000
  • 1 <= M <= 100.000
  • -100.000 <= elementele şirului <= 100.000
  • Pentru 25% din punctaj, 1 <= N <= 5.000 şi 1 <= M <= 10.000

Exemplu

intervalxy.in

10
2 -4 3 7 1 -2 -1 3 5 8
6
2 1 4
1 2 0
1 4 6
1 7 3
2 4 6
2 3 8

intervalxy.out

20
13
22

Explicație

Pentru prima întrebare intervalul căutat este : 2 -4 3 7, cu costul
(7-2)+(7+4)+(7-3)+(7-7) = 20

Pentru a doua întrebare, intervalul căutat este: 6 1 -2, cu costul
(6-6)+(6-1)+(6+2) = 13

Pentru a treia întrebare, intervalul căutat este: 3 6 1 -2 3 3, cu costul
(6-3)+(6-6)+(6-1)+(6+2)+(6-3)+(6-3) = 22

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Intervalxy:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,v[270001],x,y,tip,init[100005],maxim;
long long sum[270001],rez;


void UpdateARB(int nod,int destination,int st,int dr,int val)
{
    if (st==dr)
    {
        sum[nod]=val;
        v[nod]=val;
        return;
    }
    int mij=(st+dr)/2;
    if (destination<=mij) UpdateARB(nod*2,destination,st,mij,val);else
                          UpdateARB(nod*2+1,destination,mij+1,dr,val);
    v[nod]=max(v[nod*2],v[nod*2+1]);
    sum[nod]=1LL*sum[nod*2]+1LL*sum[nod*2+1];
}

void QueryARB(int nod,int st,int dr,int left,int right)
{
    if (left<=st && dr<=right)
    {
        maxim=max(maxim,v[nod]);
        rez=rez+1LL*sum[nod];
        return;
    }
    int mij=(st+dr)/2;
    if (left<=mij) QueryARB(nod*2,st,mij,left,right);
    if (right>mij) QueryARB(nod*2+1,mij+1,dr,left,right);
}

int main()
{
    freopen("intervalxy.in","r",stdin);
    freopen("intervalxy.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&init[i]);
        UpdateARB(1,i,1,n,init[i]);
    }
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&tip,&x,&y);
        if (tip==1)
        {
            init[x]=y;
            UpdateARB(1,x,1,n,init[x]);
        }else
        {
            rez=0;
            maxim=-100001;
            QueryARB(1,1,n,x,y);
            rez=1LL*maxim*(y-x+1)-rez;
            printf("%lld\n",rez);
        }
    }
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1591 Intervalxy

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1591 Intervalxy de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!