Cod sursa(job #1954343)

Utilizator alex99Chelba Alexandru alex99 Data 5 aprilie 2017 12:42:24
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("calafat.in");
ofstream g("calafat.out");
long long sol[200010], arb[800010];
int l,r,n,m,x,last[200010];
vector<pair<int, int> > q[200010];
pair<int, int> upd[200010];
void update(int po, int st, int dr, int a, int b)
{
    if(st==dr) {arb[po]=b; return ;}
    int m=(st+dr)/2;
    if(a<=m) update(2*po,st,m,a,b);
    else update(2*po+1,m+1,dr,a,b);
    arb[po]=arb[2*po]+arb[2*po+1];
}
void interogare(int po, int st, int dr, int a, int b, long long &sol)
{
    if(st>=a&&b>=dr) {sol+=arb[po]; return;}
    int m=(st+dr)/2;
    if(a<=m) interogare(2*po,st,m,a,b,sol);
    if(b>m) interogare(2*po+1,m+1,dr,a,b,sol);
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
    {
        f>>x;
        if(last[x])
        {
            upd[i]={last[x],i-last[x]};
        }
        last[x]=i;
    }
    for(int i=1;i<=m;i++)
    {
        f>>l>>r;
        q[r].push_back({l,i});
    }
    for(int j=1;j<=n;j++)
    {
        if(upd[j].first) update(1,1,n,upd[j].first,upd[j].second);
        for(auto it: q[j]) interogare(1,1,n,it.first,j,sol[it.second]);
    }
    for(int i=1;i<=m;i++) g<<sol[i]<<'\n';
    return 0;
}